用于在表中存储日期的字符串由于未知原因正在转换 int

cod*_*ice 3 c# sql sql-server string date

我试图将日期作为字符串存储在表中,但日期不断转换为与日期相关的负 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();
}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

Mar*_*ell 5

直接的问题是:

    , date_changed = " + date.ToString("dd-MM-yyyy") + "
Run Code Online (Sandbox Code Playgroud)

会变成

    , date_changed = 15-01-2020
Run Code Online (Sandbox Code Playgroud)

即:-2006,这是(因为日期的存储方式)在 1894 年 7 月的某个时间。

一个不好的解决方法是添加引号,但这是:不好- 它有一系列与国际化有关的问题(08-01 是 8 月 1 日?1 月 8 日?),SQL 注入等。

正确的解决办法是在整个使用的参数。例如:

cmd7.CommandText = @"
    update stock_over_time
    set    product_qty = product_qty - @qty,
           date_changed = @date
    where  product_name = @pname";
Run Code Online (Sandbox Code Playgroud)

但是,这需要您添加带有值的参数。

简单的做,这将是与小巧玲珑的方式:

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 });
Run Code Online (Sandbox Code Playgroud)

注意:你所有的数据库访问都应该被参数化,或者像上面那样,或者使用原始 ADO.NET,或者使用像 EF 等工具。不仅仅是这个地方;无处不在