这是我上一个问题(C# Using Parameters in SqlHelper.DB)的新版本。如果我将null用作参数并将命令文本设置为无参数存储过程,则可以正常工作。
SQLHelper.DB正在执行存储过程,但出现错误:
未处理的异常:System.Data.SqlClient.SqlException:过程或函数'sptest'需要未提供的参数'@ param1'。
可以通过创建一个新的.NET 4.7.2控制台应用程序并安装Nuget包SQLHelper.DB,然后使用下面的代码来重新创建。
控制台应用程序代码:
Unable to instantiate codec 'OMX.qcom.video.decoder.avc' with err 0xfffffff4.
存储过程:
MediaStream
表格:
using Microsoft.Extensions.Configuration;
using SQLHelperDB;
using SQLHelperDB.HelperClasses;
using SQLHelperDB.HelperClasses.Interfaces;
using System.Data;
using System.Data.SqlClient;
namespace ConsoleApp2
{
class Program
{
static void Main(string[] args)
{
TestSql();
}
static void TestSql()
{
IParameter[] p = new IParameter[]
{
new Parameter<string>("@param1", "test1"),
new Parameter<string>("@param2", "test2")
};
IConfigurationRoot Configuration = new ConfigurationBuilder()
.AddInMemoryCollection()
.Build();
SQLHelper helper = new SQLHelper(Configuration, SqlClientFactory.Instance, "your connection string here");
helper.CreateBatch()
.AddQuery("dbo.sptest", CommandType.StoredProcedure, p)
.Execute();
}
}
}
答案 0 :(得分:0)
在执行基础DBNull.Value
时,会忽略,而添加不带值的参数或添加具有显式初始值System.Data.SqlCommand
的参数。 ,SQLHelper.DB
正在使用。
与T-SQL进行对比,在T-SQL中,标量变量每次声明时的值为NULL
,即使没有显式的NULL
值也是如此:{{ 1}}。
这种不一致也导致我的代码在这种模式下也意外崩溃:
DECLARE @param1 VARCHAR(10)
解决方案:
command.Parameters.AddWithValue("@param1", (object)this.Status == null ? DBNull.Value : this.Status);
大概这类似于command.Parameters.Add("@param1", SqlDbType.VarChar);
command.Parameters["@param1"].Value = (object)this.Status == null ? DBNull.Value : this.Status;