首页 > 解决方案 > 用于在表中存储日期的字符串由于未知原因正在转换 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();
}

在此处输入图像描述

标签: c#sqlsql-serverstringdate

解决方案


眼前的问题是:

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

会变成

    , date_changed = 15-01-2020

这是:-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";

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

简单的方法是使用 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 等工具。不仅仅是这个地方;无处不在


推荐阅读