SQLHelper.DB not passing parameters to stored procedure

这一生的挚爱 提交于 2020-01-16 10:11:47

问题


This is a new issue of my previous question (C# Using Parameters in SqlHelper.DB). If I pass null as the parameters and set the command text to a parameterless stored procedure, it works fine.

SQLHelper.DB is executing the stored procedure but I get an error:

Unhandled Exception: System.Data.SqlClient.SqlException: Procedure or function 'sptest' expects parameter '@param1', which was not supplied.

This can be recreated by creating a new .NET 4.7.2 console app and installing Nuget package SQLHelper.DB then using the code below.

Console app code:

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

Stored procedure:

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;

Table:

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

回答1:


Adding a parameter without a value, or adding a parameter with an explicit initial value of DBNull.Value is ignored when executing the underlying System.Data.SqlCommand, which SQLHelper.DB is using.

Contrast this with T-SQL, where the scalar variable exists with a value of NULL every time you declare it, even without an explicit NULL value: DECLARE @param1 VARCHAR(10).

This inconsistency has caused my code to crash unexpectedly under this pattern as well:

command.Parameters.AddWithValue("@param1", (object)this.Status == null ? DBNull.Value : this.Status);

The solution:

command.Parameters.Add("@param1", SqlDbType.VarChar);
command.Parameters["@param1"].Value = (object)this.Status == null ? DBNull.Value : this.Status;

Presumably this translates similarly to SQLHelper.DB



来源:https://stackoverflow.com/questions/58807720/sqlhelper-db-not-passing-parameters-to-stored-procedure

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!