参数化Sql查询中的日期格式解决方案"DD/MM/YYYY"格式

mah*_*esh 0 c#

我在很多网站上都提过这个问题,我的问题仍未得到答复.有些人建议我对maskedtextbox使用datetimepicker.

确实,datetimepicker解决了所有与日期相关的问题,而屏蔽文本框返回一个字符串,这就是为什么它在C#中的参数化sql查询中创建日期时间转换问题的原因.

在大多数情况下,由于耗时的问题,我们不使用datetimepicker.我的意思是如果有数千个数据输入待处理,如果我们使用datetimepicker,则手指在鼠标和键盘之间分配.因此,在我的情况下,我总是使用maskedtextbox,它会产生日期转换的问题.我试图通过以下方式解决它:

String sql="insertintodummy(name,date)values(@name,convert(datetime,'"+maskedTextBox1.text+"', 103)"; //  for 'dd/mm/yyyy' format.
sqlcommand cmd=new sqlcommand(sql,con);
cmd.parameters.Add("@name",SqldbType.Varchar).Value= textbox1.text;
cmd.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)

我认为没有办法在C#,VS-2005的参数化查询中使用上述日期时间转换.

如果只有datefield必须输入方式,上面的代码是有用的.如果有比建议更好的方法.

现在它是完美的解决方案,如下所示

string sql="insert into dummy(name,date)values(@name,@date)";

IFormateprovider Culture = new CultureInfo("fr-FR",True);

DateTime mydate=DateTime.parse(
maskedtextbox1.text,Culture,DateTimeStyles.NocurrentDateDefault
);

sqlcommand cmd=new sqlcommand(sql,con);

cmd.Parameters.Add(@name,SqlDbtypes.Varchar).Values= Textbox1.text;

cmd.Parameters.Add(@date, SqlDbtypes.Datetime).Values=mydate;

cmd.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)

谢谢.

Rob*_*Rob 7

为什么在有一个非常好的参数时只需要使用Sql中的转换(以及仅通过部分参数化查询来进行风险注​​入)SqlDbType.DateTime:

string sql = "insert into dummy (name, date) values (@name, @date)";
SqlCommand cmd = new SqlCommand(sql, con);
cmd.Parameters.Add("@name", SqldbType.Varchar).Value = textbox1.text;
cmd.Parameters.Add("@date", SqlDbType.DateTime).Value = Convert.ToDateTime(maskedTextBox1.Text);
cmd.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)

明显的警告:

  • 不检查maskedTextBox1.Text实际上是否包含DateTime(DateTime.TryParse)
  • 不检查提供的DateTime是否落在SqlDbType.DateTime处理的DateTime范围内