这是我上一个问题(C# Using Parameters in SqlHelper.DB)的新一期。如果我将null作为参数传递,并将命令文本设置为无参数存储过程,则可以正常工作。
SQLHelper.DB正在执行存储过程,但我得到了一个错误:
未处理的异常: System.Data.SqlClient.SqlException:过程或函数'sptest‘期望参数’@ expects 1‘,该参数没有提供。
这可以通过创建一个新的.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]发布于 2019-11-11 19:53:48
添加一个没有值的参数,或者添加一个显式初始值为DBNull.Value的参数,在执行底层System.Data.SqlCommand ( SQLHelper.DB正在使用的)时,忽略了。
与this相比,标量变量在每次声明时都存在一个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
https://stackoverflow.com/questions/58807720
复制相似问题