Строка, предназначенная для хранения даты в таблице, конвертирует int по неизвестной причине. - PullRequest
3 голосов
/ 15 января 2020

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

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();
}

enter image description here

Ответы [ 2 ]

5 голосов
/ 15 января 2020

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

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

станет

    , date_changed = 15-01-2020

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

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

правильное исправление - использовать параметры повсюду , Например:

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 et c , Не только это одно место; везде .

2 голосов
/ 15 января 2020

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

Также, Рекомендуется использовать параметризованный запрос, чтобы избежать 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();
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...