【问题标题】:Why AddWithValue when is dcd_first_name SQL Server Profile gives me default? and when store procedure execute crash the execution为什么当 dcd_first_name SQL Server Profile 给我默认时 AddWithValue?当存储过程执行崩溃时
【发布时间】:2014-09-04 16:12:51
【问题描述】:

我有这个代码:

var SQL ="SP_PROC";

SqlCommand cmd = new SqlCommand(SQL, connection)
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@dcd_first_name", name);
cmd ExecuteNonQuery();

为什么AddWithValue when is dcd_first_name SQL Server Profile 给了我默认值?并且当存储过程执行时,它会导致执行崩溃。

个人资料给我:EXEC SP_PROC default

我想当我在参数中传递一个空值时,在这种情况下,名称会自动将AddWithValue 转换为DBNull.Value。我必须指定它。

使用AddWithValue参数是不是最好的方法?

【问题讨论】:

标签: c# ado.net


【解决方案1】:

AddWithValue 不会自动从null 转换为DBNull.Value

来自MSDNAddWithValue(string parameterName, Object value) 上的文档:

- 要添加的值。使用 DBNull.Value 代替 null,表示 null 值。

将调用更改为以下将修复它:

cmd.Parameters.AddWithValue("@dcd_first_name", 
                             name == null ? DBNull.Value : (object)name);

编辑

在 cmets 中,您询问 AddWithValue 是否是添加参数的最佳方式。在我看来,答案是“否”

根据@marc_s 的评论:

您应该查看Can we stop using AddWithValue() already? 并停止使用.AddWithValue() - 它可能会导致意想不到和令人惊讶的结果..

有关可能发生的问题的示例,请参阅此 SO 问题 - c# SQL Server : DATETIME datatype

我的首选方法是使用Add 的重载,它采用SqlDbType,然后设置Value 属性:

cmd.Parameters.Add("@dcd_first_name", SqlDbType.VarChar)
              .Value = name == null ? DBNull.Value : (object)name;

【讨论】:

  • 正如您在回答中指出的那样,这是我所做的,但我有一些好奇心要问。是我想象的。无论如何,这是设置参数的最佳方法吗?
【解决方案2】:

您尚未将命令类型设置为存储过程。实例化 cmd 对象后,添加以下行:

cmd.CommandType = CommandType.StoredProcedure;

【讨论】:

  • 我忘了在这里添加抱歉
  • 这不是我要找的答案,我需要一些为什么没有代码更正
猜你喜欢
  • 1970-01-01
  • 2012-04-27
  • 2012-03-21
  • 2015-11-12
  • 1970-01-01
  • 2019-02-18
  • 1970-01-01
相关资源
最近更新 更多