首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQLHelper.DB不向存储过程传递参数

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

Stack Overflow用户
提问于 2019-11-11 19:45:12
回答 1查看 330关注 0票数 0

这是我上一个问题(C# Using Parameters in SqlHelper.DB)的新一期。如果我将null作为参数传递,并将命令文本设置为无参数存储过程,则可以正常工作。

SQLHelper.DB正在执行存储过程,但我得到了一个错误:

未处理的异常: System.Data.SqlClient.SqlException:过程或函数'sptest‘期望参数’@ expects 1‘,该参数没有提供。

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

控制台应用程序代码:

代码语言:javascript
复制
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();
        }
    }
}

存储过程:

代码语言:javascript
复制
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;

表:

代码语言:javascript
复制
CREATE TABLE [dbo].[tbltest]
(
    [field1] [VARCHAR](10) NULL,
    [field2] [VARCHAR](10) NULL
) ON [PRIMARY]
EN

回答 1

Stack Overflow用户

发布于 2019-11-11 19:53:48

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

与this相比,标量变量在每次声明时都存在一个NULL值,即使没有显式的NULL值:DECLARE @param1 VARCHAR(10)

这种不一致也导致我的代码在这种模式下意外崩溃:

代码语言:javascript
复制
command.Parameters.AddWithValue("@param1", (object)this.Status == null ? DBNull.Value : this.Status);

解决办法:

代码语言:javascript
复制
command.Parameters.Add("@param1", SqlDbType.VarChar);
command.Parameters["@param1"].Value = (object)this.Status == null ? DBNull.Value : this.Status;

想必这类似于SQLHelper.DB

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58807720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档