我们正在将旧的C#应用程序迁移到最新版本的C#(和.NET框架),并且在测试期间遇到了问题。没有什么是地球的 - 只是基本的数据访问代码。
具体来说,我们正在创建名为' @ BalanceForward'的SqlParameter。在这种特殊情况下,我们将值设置为零 - 尽管它显然可能是其他值。在执行存储过程时,我们会收到一个错误,该过程需要一个名为' @ BalanceForward'但它没有指定。奇
我们运行了SQL跟踪并看到了以下内容......
exec usp_Transaction_Create @Id ='虚拟值',@ BalanceForward = default
正如您所看到的,零美元金额正在幕后更改为默认'。它必须是.NET框架中的行为更改 - 从仍在生产中的版本查看SQL跟踪,零美元金额将传递为0.00。
有没有办法禁用它,只是让它传递实际值而不是'默认'?我们并不是真的想要通过数百个存储过程来解释这可能发生的可能性。
答案 0 :(得分:0)
我们正在使用此代码...
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;
}
然而 - 我们现在偶然发现了在某些时候添加到SqlParameter对象的AddWithValue选项。我们一直在使用抽象的DbCommand,DbConnection,DbParameter等对象,并通过app.config设置传入提供程序。
从抽象版本切换到SqlParameter对象并使用AddWithValue选项解决了该问题。现在 - 问题在于如何使用DbParameter对象,将所有抽象代码转换为System.Data.SqlClient版本,或修改所有存储过程。