【发布时间】:2020-05-02 08:20:15
【问题描述】:
我正在尝试将日期作为字符串存储在表格中,但日期不断转换为与日期相关的负 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();
}
【问题讨论】:
-
原因已知 - 字符串连接。它将代码暴露给 SQL 注入和转换错误。改用适当的参数化查询
-
将值连接成字符串以生成 SQL 是第一个主要问题;有没有好处可以来自 - (搜索:“SQL注入”)
-
更好的是,谷歌搜索
Bobby Tables。想象一下如果product字段包含值'; drop table Users;--会发生什么 -
另一个严重的转换错误,使用
dd-MM-yyyy作为日期文字。这是一个 localized 字符串,例如在美国无法识别,或者导致错误的日期,例如 4 月 7 日而不是 7 月 4 日。如果您使用日期,则不会有任何此类问题-类型参数 -
SQL Server 有不止一种 DataTime 类型。检查服务器中的类型。可能是日期存储不正确,因此当您使用 SQL Server Management Studio 时,请查询数据库以验证日期是否正确。
标签: c# sql sql-server string date