【问题标题】:Insert date-time from c# in sql server without parametrized query's在没有参数化查询的情况下从 c# 在 sql server 中插入日期时间
【发布时间】:2012-11-27 05:57:18
【问题描述】:

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

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

【问题讨论】:

  • 在旁注中,不想使用参数化查询的原因是什么?
  • @FrederikGheysels 这是一个旧应用程序,为了统一,不能只在一个地方使用参数化查询。要么我们将整个应用程序完全迁移到它上面,要么照原样携带这个东西:(。

标签: c# datepicker


【解决方案1】:

编辑

为了避免“'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

Benefits of use parameters instead of concatenation

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

注意

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

【讨论】:

  • 它给出了编译时错误“无法确定条件表达式的类型,因为'string'和'System.DBNull'之间没有隐式转换”
  • @ankur - 所以对于这件事,你最好使用参数查询...支持 DBNull.Value
  • 这一行 dtpExpires.Enabled ? dtpExpires.Value.ToString() : DBNull.Value 甚至不应该编译。从条件运算符返回两种不同的类型是编译时错误
  • @PranayRana Dude 正确阅读了问题,没有参数化查询的范围。顺便说一句,您在 command.Parameters.AddWithValue("@dtpExpires", caseid); 中添加的 caseID 是什么?大声笑:)
  • @PranayRana,我相信您的编辑dtpExpires.Enabled ? dtpExpires.Value : DBNull.Value 会导致同样的错误。您可以从答案中删除它,或者您可以将 Date 作为字符串传递并 NULL 而不是 DBNull.Value
【解决方案2】:

由于您将 datetime 和 null 数据都作为字符串发送,所以让 sql server 使用 CONVERT 函数处理从字符串到 datetime 的转换

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-18
    • 2014-05-03
    • 1970-01-01
    • 1970-01-01
    • 2018-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多