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)
在直接的问题是:
, 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 等工具。不仅仅是这个地方;无处不在。
| 归档时间: |
|
| 查看次数: |
97 次 |
| 最近记录: |