2

我正在开发一个相当古老的应用程序,当时没有使用参数化查询。

sql我必须在数据类型为表的列中插入日期时间值,date-time此列中不允许空值。

我的代码。

var expires = dtpExpires.Enabled ? dtpExpires.Value.ToString() : "'1/1/1900 12:00:00 AM'";
string query = "INSERT INTO route (expires) Values ("+ expires +")";

这样做的问题是,当日期选择器被禁用时,必须传递一个默认值,因为不允许 null。因此,为此我必须包含一个额外'' 的日期来包裹日期并且它可以正常工作。

但是,当启用日期选择器并且尝试将有效日期时间插入数据库时​​,由于缺少''围绕expires变量的包装,它会失败。

是否有任何干净的方法可以在没有参数化查询的情况下做到这一点。更新代码时会出现同样的问题。可以有一种干净的方法来处理这两种情况,而不是只添加if-else子句。

4

2 回答 2

2

编辑

避免“无法确定条件表达式的类型,因为'string'和'System.DBNull'之间没有隐式转换”

SqlCommand command = new SqlCommand("INSERT INTO route (expires) 
                                   Values (@dtpExpires)", connections);
SqlParameter dtpExpires= new SqlParameter("@dtpExpires", SqlDbType.DateTime, 10);
dtpExpires.Value = dtpExpires.Enabled ? dtpExpires.Value : DBNull.Value;
command.Parameters.Add(dtpExpires);

为您提供信息 OP@ankur

使用参数而不是串联的好处

  • 安全。连接使您可以进行 SQL 注入,尤其是当 TB 代表文本框时。(强制性XKCD卡通
  • 类型安全。您解决了很多 DateTime 和数字格式问题。
  • 速度。查询不会一直改变,系统可能能够重新使用查询句柄。

笔记

最好使用 pram 查询来避免 sql 注入攻击。

于 2012-11-27T05:59:04.330 回答
0

因为您将日期时间和空数据都作为字符串发送,所以让 SQL 服务器使用 CONVERT 函数处理从字符串到日期时间的转换

  var expires = dtpExpires.Enabled ? "'" + tpExpires.Value.ToString() + "'" : "null";

  string query = "INSERT INTO route (expires) Values (CONVERT(datetime, " + expires + "))";
于 2012-11-27T08:04:32.153 回答