【问题标题】:C# INSERT to SQL method exception when DateTime parameter is null当 DateTime 参数为空时,C# INSERT to SQL 方法异常
【发布时间】:2020-11-03 15:32:33
【问题描述】:

我的一个参数如下所示:

cmd.Parameters.Add("@last_sign_in_at", SqlDbType.DateTime).Value = user.last_sign_in_at;

我知道用户在last_sign_in_at 中有空值。数据库接受此列的空值,但出现异常:

SqlException:参数化查询 '(@id int,@name nvarchar(18),@username nvarchar(11),@state nvarch' 需要参数 '@last_sign_in_at',但未提供。

【问题讨论】:

  • 提示:如果您使用 Dapper,它会为您为您提供类似的东西,并避免大量代码:connection.Execute(@"...SQL...", new { user.last_sign_in_at });

标签: c# sql


【解决方案1】:

您应该使用 DBNull.Value:

cmd.Parameters.Add("@last_sign_in_at", SqlDbType.DateTime).Value = (object)user.last_sign_in_at ?? (object)DBNull.Value;

在这里转换为对象只是为了让操作员?? 不抱怨不同的类型

【讨论】:

  • 运算符'??'不能应用于“日期时间”类型的操作数?和“DBNull”
  • 预计,您可以使用 (object)user.last_sign_in_at?? (object)DBNull.Value
  • 我用过cmd.Parameters.Add("@last_sign_in_at", SqlDbType.DateTime).Value = user.last_sign_in_at ?? DateTime.Today;
  • 但这不是空的,你是什么意思?您插入今天的时间,您应该使用 DBNull.Value,如果您的列在 SQL 表中为 Nullable,这也很明显
【解决方案2】:

在使用原始 .net 框架时,我总是不得不使用值 DBNull.Value

cmd.Parameters.Add("@last_sign_in_at", SqlDbType.DateTime).Value = DBNull.Value;

【讨论】:

  • 但 user.last_sign_in_at 并不总是 NULL,但当它为 null 时,方法会引发异常
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-10
  • 2021-08-22
  • 2015-03-12
  • 1970-01-01
  • 1970-01-01
  • 2011-12-10
  • 1970-01-01
相关资源
最近更新 更多