繁体   English   中英

在没有参数化查询的情况下在 sql server 中插入来自 c# 的日期时间

[英]Insert date-time from c# in sql server without parametrized query's

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

我必须在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子句。

编辑

避免“无法确定条件表达式的类型,因为‘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卡通)
  • 类型安全。 您解决了许多日期时间和数字格式问题。
  • 速度。 查询不会一直更改,系统可能能够重新使用查询句柄。

笔记

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

由于您将日期时间和空数据作为字符串发送,因此使用 CONVERT 函数让 sql server 处理从字符串到日期时间的转换

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

  string query = "INSERT INTO route (expires) Values (CONVERT(datetime, " + expires + "))";

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM