Строка, предназначенная для хранения даты в таблице, конвертирует int по неизвестной причине.

Я пытаюсь получить дату для сохранения в виде строки в таблице, но дата продолжает преобразовываться в отрицательное 4-значное число, которое коррелирует с датой, и я не могу на всю жизнь выяснить, где я испортил Обратите внимание, что я использую комбо C # и SQL Server

foreach(DataRow dr in dt.Rows)
{
    int qty = 0;
    string pname = "";

    SqlCommand cmd3 = con.CreateCommand();
    cmd3.CommandType = CommandType.Text;
    cmd3.CommandText = "insert into order_item values('" + orderid.ToString() + "','" + dr["product"].ToString() + "'," +
        "'" + dr["price"].ToString() + "','" + dr["qty"].ToString() + "','"+ dr["total"].ToString() + "')";
    cmd3.ExecuteNonQuery();

    qty = Convert.ToInt32(dr["qty"].ToString());
    pname = dr["product"].ToString();

    SqlCommand cmd6 = con.CreateCommand();
    cmd6.CommandType = CommandType.Text;
    cmd6.CommandText = "update stock set product_qty = product_qty - " + qty + " where product_name = '"+pname.ToString()+"'";
    cmd6.ExecuteNonQuery();

    // date keeps getting updated to negative 4 digit number which coordinates with the date. ex: 14-01-2020 is converting to -2007.
    SqlCommand cmd7 = con.CreateCommand();
    cmd7.CommandType = CommandType.Text;
    **cmd7.CommandText = "update stock_over_time set product_qty = product_qty - " + qty + ", date_changed = " + date.ToString("dd-MM-yyyy") + "" +
        " where product_name = '" + pname.ToString() + "'";**
    cmd7.ExecuteNonQuery();
}

введите описание изображения здесь

Всего 2 ответа

Автоматический диспенсер мыльной пены от xiaomi.


Непосредственная проблема заключается в том, что:

    , date_changed = " + date.ToString("dd-MM-yyyy") + "

станет

    , date_changed = 15-01-2020

что: -2006 , то есть (из-за того, как хранятся даты) какое-то время в июле 1894 года.

Плохим решением для этого будет добавление кавычек, но это: плохо - у него есть целый ряд проблем, связанных с интернационализацией (08-01 первого августа? 8 января?), SQL-инъекцией и т. Д.

Правильное решение заключается в использовании параметров во всем. Например:

cmd7.CommandText = @"
    update stock_over_time
    set    product_qty = product_qty - @qty,
           date_changed = @date
    where  product_name = @pname";

Это, однако, требует добавления параметров со значениями.

Самый простой способ сделать это с помощью Dapper:

string pname = ...
int qty = ...
DateTime date = ...
con.Execute(@"
    update stock_over_time
    set    product_qty = product_qty - @qty,
           date_changed = @date
    where  product_name = @pname",
    new { pname, qty, date });

Примечание: весь доступ к вашей базе данных должен быть параметризован, как описано выше, или с использованием необработанного ADO.NET, или с использованием инструментов, таких как EF и т. Д. Не только это одно место; везде


Дата не должна храниться как строковый тип данных, вместо этого измените date-changed измените ее на тип даты и времени (или даже просто на дату, так как хранимые значения не имеют элемента «время»).

Кроме того, рекомендуется использовать параметризованный запрос, чтобы избежать внедрения SQL

string sql = @"update stock_over_time set product_qty = product_qty - @qty, date_changed = @date where product_name = @pname";

using (SqlConnection connection = new SqlConnection(connString)
{
  connection.Open();
  using (SqlCommand cmd= new SqlCommand(sql, connection))
  {
     cmd.Parameters.Add("@qty", SqlDbType.SqlInt32).value = qty;  
     cmd.Parameters.Add("@date", SqlDbType.SqlDateTime).value =  date;
     cmd.Parameters.Add("@pname", SqlDbType.Varchar, 50).value = pname;
     cmd.ExecuteNonQuery();
  }
}

Есть идеи?

10000