【问题标题】:C# SqlParameter of 0 changed to 'default'0 的 C# SqlParameter 更改为 'default'
【发布时间】:2016-06-21 21:00:11
【问题描述】:

我们正在将较旧的 C# 应用程序迁移到最新版本的 C#(和 .NET 框架),并且在测试期间遇到了问题。没有什么惊天动地的 - 只是基本的数据访问代码。

具体来说,我们正在创建一个名为“@BalanceForward”的 SqlParameter。在这种特殊情况下,我们将值设置为零 - 尽管它显然可以是其他值。执行存储过程时,我们收到一个错误,该过程需要一个名为“@BalanceForward”的参数,但未指定。奇怪。

我们运行 SQL 跟踪并看到以下内容...

执行 usp_Transaction_Create @Id='dummy value',@BalanceForward=default

如您所见,零美元金额正在幕后更改为“默认”。这一定是 .NET 框架的行为改变 - 从仍在生产的版本中查看 SQL 跟踪,零美元金额作为 0.00 传递。

有没有办法禁用它并让它传递实际值而不是“默认”?我们真的不想通过数百个存储过程来说明可能发生这种情况的可能性。

【问题讨论】:

标签: c# sql-server stored-procedures


【解决方案1】:

我们正在使用此代码...

cmd.Parameters.Add(DataFactory.CreateParameter("@BalanceForward", 0));

public static DbParameter CreateParameter(string name, object value)
{
   DbParameter param = _dataFactory.CreateParameter();
   param.ParameterName = name;
   if (value == null)
      param.Value = DBNull.Value;
   else
      param.Value = value;
   return param;
}

但是 - 我们现在偶然发现了 AddWithValue 选项,该选项在某些时候添加到 SqlParameter 对象。我们一直在使用抽象的 DbCommand、DbConnection、DbParameter 等对象,并通过 app.config 设置传入提供程序。

从抽象版本切换到 SqlParameter 对象并使用 AddWithValue 选项已解决该问题。现在 - 需要弄清楚如何使用 DbParameter 对象执行此操作,将所有抽象代码转换为 System.Data.SqlClient 版本,或修改我们所有的存储过程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-24
    • 1970-01-01
    • 2012-01-11
    相关资源
    最近更新 更多