【问题标题】:How do I send a date time picker value to SQL local database?如何将日期时间选择器值发送到 SQL 本地数据库?
【发布时间】:2015-11-15 18:25:23
【问题描述】:

所以问题是,我尝试使用 c# 将 2 个日期插入到我的本地数据库中,日期值取自 2 个不同的 datetimepicker,称为 dtp1 和 dtp2,但我不知道该怎么做,我尝试了以下操作:

connect.Open();
command = new SqlCommand("insert into ab (id, name, data1, data2) values ("+int.Parse(textbox_id.Text)+", '"+textBox_name.Text+"', "+dtp1.Value+","+dtp2.Value+")",connect);
command.ExecuteNonQuery();
connect.Close();

错误是:语法不正确

【问题讨论】:

  • 完整的错误信息到底是什么?你的列类型是什么?您应该始终使用参数化语句。这种字符串连接对 SQL 注入攻击开放。
  • 你听说过参数化查询吗?

标签: c# sql-server database date datetime


【解决方案1】:

首先让我们修复代码中的 SQL 注入漏洞。使用参数创建查询:

command = new SqlCommand("insert into ab (id, name, data1, data2) values (@id, @name, @data1, @data2)",connect);

然后您可以简单地为这些参数添加值,而不必担心它们的字符串表示(使您当前的问题没有实际意义):

command.Parameters.AddWithValue("@id", int.Parse(textbox_id.Text));
command.Parameters.AddWithValue("@name", textBox_name.Text);
command.Parameters.AddWithValue("@data1", dtp1.Value);
command.Parameters.AddWithValue("@data2", dtp2.Value);

这里的好处包括:

  • 代码更加简洁易读
  • 您可以按原样使用值,而不是尝试将它们转换为特定的字符串表示形式
  • 最重要的是,您将用户输入视为而不是可执行代码

【讨论】:

  • 谢谢!我按照你说的做了,我现在明白了,它有效。
【解决方案2】:
  1. 使用SqlParameter 确保不会进行sql 注入:How does SQLParameter prevent SQL Injection?

  2. 如果您使用字符串连接,请尝试使用string.Format 让事情更清楚:string.Format("insert into ab (id, name, data1, data2) values ({0}, '{1}', {2}, {3})", textbox_id.Text, textBox_name.Text, dtp1.Value, dtp2.Value)。但总的来说这不是一个好主意来传递参数。

  3. 如果您稍后在连接时创建ToString,为什么还要使用int.parse?这不是必需的:("+int.Parse(textbox_id.Text)+",。这与此相同:("+(int.Parse(textbox_id.Text)).ToString()+", 与此相同:textbox_id.Text。此外,如果textbox_id.Text 不包含某些可以解析为整数的内容,则会引发异常。如果要检查整数,只需使用int.TryParse

  4. 如果dtp1.Valuedtp2.Value 为空,或者您尝试传递整数以外的其他内容,您可能会遇到一些语法错误。

SqlParamter 用于DateTime 甚至具有您不必关心DateTime 格式的优点。这真的很烦人。

【讨论】:

  • 感谢您的提示,我使用了 sqlparameters 并且还按照您说的编辑了 id。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多