C# SQLHelper.DB不向存储过程传递参数

C# SQLHelper.DB不向存储过程传递参数,c#,sql-server,sqlhelper,C#,Sql Server,Sqlhelper,这是我上一个问题()的新问题。如果我将null作为参数传递,并将命令文本设置为无参数存储过程,那么它可以正常工作 SQLHelper.DB正在执行存储过程,但出现错误: 未处理的异常:System.Data.SqlClient.SqlException:过程或函数“sptest”需要未提供的参数“@param1” 可以通过创建新的.NET 4.7.2控制台应用程序并安装Nuget软件包SQLHelper.DB,然后使用下面的代码来重新创建 控制台应用程序代码: using Microsoft.E

这是我上一个问题()的新问题。如果我将null作为参数传递,并将命令文本设置为无参数存储过程,那么它可以正常工作

SQLHelper.DB正在执行存储过程,但出现错误:

未处理的异常:System.Data.SqlClient.SqlException:过程或函数“sptest”需要未提供的参数“@param1”

可以通过创建新的.NET 4.7.2控制台应用程序并安装Nuget软件包SQLHelper.DB,然后使用下面的代码来重新创建

控制台应用程序代码:

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();
        }
    }
}
表:

CREATE TABLE [dbo].[tbltest]
(
    [field1] [VARCHAR](10) NULL,
    [field2] [VARCHAR](10) NULL
) ON [PRIMARY]

在执行正在使用的基础
SQLHelper.DB
System.Data.SqlCommand
时,添加一个没有值的参数,或添加一个显式初始值为
DBNull的参数。value
忽略

与T-SQL相比,T-SQL每次声明标量变量时,标量变量的值都是
NULL
,即使没有明确的
NULL
值:
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;

假设这类似于
SQLHelper.DB

,这不是本例中的问题,因为我在上面的代码中显式设置了参数值。。。但这很好知道!
command.Parameters.Add("@param1", SqlDbType.VarChar);
command.Parameters["@param1"].Value = (object)this.Status == null ? DBNull.Value : this.Status;