首页 > 解决方案 > SQLHelper.DB 未将参数传递给存储过程

问题描述

这是我上一个问题(C# Using Parameters in SqlHelper.DB)的新问题。如果我将 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 PROCEDURE [dbo].[sptest]
    (@param1 VARCHAR(10),
     @param2 VARCHAR(10))
AS
BEGIN
    SET NOCOUNT ON;

    INSERT INTO dbo.tbltest (field1, field2)
    VALUES (@param1, @param2);
END;

桌子:

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

标签: c#sql-serversqlhelper

解决方案


添加一个没有值的参数,或者添加一个具有显式初始值的参数在执行底层时DBNull.Value会被忽略System.Data.SqlCommand,它SQLHelper.DB正在使用。

NULL 将此与 T-SQL 进行对比,在 T-SQL 中,标量变量在每次声明时都存在一个值,即使没有显式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


推荐阅读