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

C# 用于在表中存储日期的字符串由于未知原因正在转换int,c#,sql,sql-server,string,date,C#,Sql,Sql Server,String,Date,我试图将日期作为字符串存储在表中,但日期一直转换为与日期相关的负4位数字,我一辈子都搞不清楚我把事情搞砸了。请注意,我使用的是C#和SQL Server的组合 foreach(数据行中的数据行dr) { 整数数量=0; 字符串pname=“”; SqlCommand cmd3=con.CreateCommand(); cmd3.CommandType=CommandType.Text; cmd3.CommandText=“插入订单”项值(“+orderid.ToString()+”,“+dr[“

我试图将日期作为字符串存储在表中,但日期一直转换为与日期相关的负4位数字,我一辈子都搞不清楚我把事情搞砸了。请注意,我使用的是C#和SQL Server的组合

foreach(数据行中的数据行dr)
{
整数数量=0;
字符串pname=“”;
SqlCommand cmd3=con.CreateCommand();
cmd3.CommandType=CommandType.Text;
cmd3.CommandText=“插入订单”项值(“+orderid.ToString()+”,“+dr[“product”]。ToString()+”,”+
““+dr[“价格”].ToString()+”,“+dr[“数量”].ToString()+”,“+dr[“总计”].ToString()+”)”;
cmd3.ExecuteNonQuery();
数量=转换为32(dr[“数量”].ToString());
pname=dr[“产品”].ToString();
SqlCommand cmd6=con.CreateCommand();
cmd6.CommandType=CommandType.Text;
cmd6.CommandText=“更新库存集产品数量=产品数量-”+qty+”,其中产品名称=“+pname.ToString()+”;
cmd6.ExecuteOnQuery();
//日期不断更新为与日期相协调的负4位数。例如:14-01-2020正在转换为-2007。
SqlCommand cmd7=con.CreateCommand();
cmd7.CommandType=CommandType.Text;
**cmd7.CommandText=“随时间更新库存设置产品数量=产品数量-”+qty+”,日期更改=“+date.ToString(“dd-MM-yyyy”)+“”+
“其中product_name=”+pname.ToString()+”**
cmd7.ExecuteOnQuery();
}
当前的问题是:

,date_changed=“+date.ToString(“dd-MM-yyyy”)+”
将成为

,更改日期=2020年1月15日
这是:
-2006
,这是(因为日期是如何存储的)1894年7月的某个时间

一个坏的修复方法是添加引号,但这是:坏的-它与国际化(08-01是8月1日吗?1月8日吗?)和SQL注入等有一系列问题

正确的修复方法是在整个过程中使用参数。例如:

cmd7.CommandText=@”
随时间更新库存
设置产品数量=产品数量-@数量,
更改日期=@date
其中产品名称=@pname”;
然而,这需要您添加带有值的参数

最简单的方法是使用Dapper:

string pname=。。。
整数数量=。。。
日期时间日期=。。。
con.Execute(@)
随时间更新库存
设置产品数量=产品数量-@数量,
更改日期=@date
其中product_name=@pname“,
新的{pname,qty,date});


注意:数据库访问的所有都应该参数化,要么像上面那样,要么使用原始ADO.NET,要么使用EF等工具。而不仅仅是这一个地方;任何地方。

日期不应存储为字符串数据类型,而应将
datechanged
更改为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();
  }
}

原因是已知的-字符串连接。它使代码暴露于SQL注入和转换错误。第一个主要问题是使用适当的参数化查询,而不是将值串接成字符串来生成SQL;(搜索:“SQL注入”)没有更好的效果,谷歌搜索
Bobby Tables
。想象一下,如果
产品
字段包含值
,会发生什么情况;删除表用户--另一个严重的转换错误,使用
dd-MM-yyyy
作为日期文字。这是一个本地化字符串,不会被识别,例如在美国,或导致错误的日期,et 4月7日而不是7月4日。如果使用日期类型的参数,则不会出现任何此类问题SQL Server具有多个DataTime类型。检查服务器中的类型。可能是日期存储不正确,因此当您使用SQL Server Management Studio查询数据库以验证日期是否正确时。