将 C# 中的参数传递到 SQL Server 存储过程 - 指定的参数太多

问题描述 投票:0回答:1

我在 SQL Server 中有这个存储过程:

ALTER PROCEDURE [dbo].[stpr_WPC_UpdatePOReply] 
    @eComments NVarChar(200)
AS
BEGIN
    SET NOCOUNT ON;

    UPDATE dbo.SupplierProductionScheduleReplies 
    SET Comments = @eComments 
    WHERE id = 39906;
END

我对上面的

id
列值进行了硬编码,以简化代码,直到我明白出了什么问题 - 一旦排序,它也将作为参数传递。

我有从 Bizagi 运行的代码,使用他们修改后的 C# 版本:

//UPDATING FULL PO (PO CHECK)
//https://stackoverflow.com/questions/50519158/executing-a-sql-server-stored-procedure-from-c-sharp#50519216
//accessed by MO 20221215
//https://stackoverflow.com/questions/50519158/executing-a-sql-server-stored-procedure-from-c-sharp?rq=3
//accessed by MO 20240320
//https://learn.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-ver16
//accessed by MO 20240320

// Set the connection string
var strcnx = CHelper.getParameterValue("SV11SAGE01-StockControl");

// set the variable and value from a form
var eComments = <m_WPC_WeeklyProductChase.idm_WPC_POCheck.eKPComments>
var connection = new System.Data.SqlClient.SqlConnection();

// identify the stored procedure
var cmd = new SqlCommand("dbo.stpr_WPC_UpdatePOReply");

connection.ConnectionString = strcnx;
cmd.CommandType = CommandType.StoredProcedure;

// add a parameter, based on the variable eComments
cmd.Parameters.Add("@eComments", SqlDbType.NVarChar, 200).Value = eComments;

try
{
    // running a stored procedure
    connection.Open();
    cmd.Connection = connection;

    cmd.ExecuteNonQuery();
}
catch(exc)
{
    CHelper.ThrowValidationError(exc);
}
finally
{
    connection.Close();
}

当我运行代码时,出现错误:

过程或函数 stpr_WPC_UpdatePOReply 指定了太多参数。

我尝试删除参数,然后使用存储过程中硬编码的参数调用存储过程,并且更新运行没有问题。

但是,当我添加参数时,代码出现错误。我大约有 15 个参数需要添加,但我已将代码和存储过程减少到 1 和 2 个参数,直到我可以解决问题,届时我将添加额外的参数。

我查阅了很多文章,据我所知,变量名和数据类型匹配(我假设C#中指定的

NVarChar 200
相当于
NVarChar(Max)
,建议对存储过程进行SQL参数查询在一篇文章中给出了以下内容:

ParameterName: @eComments; 
DataType: nvarchar;
max_length: 400;
is_output: 0

我尝试使用 2 个参数运行,另一个参数是记录 ID 的参数。

我尝试过使用

AddWithValue
。我尝试过使用和不使用
cmd.Parameters.Clear()
线。列
Comments
在 SQL Server 中定义为
(nvarchar(max), null)

我已检查存储过程名称是否匹配 - 如果没有指定参数,它可以正常工作。

我已经尽可能简化了我正在做的事情,以减少愚蠢错误和打字错误的可能性,但看不到我做错了什么。最初,我在没有参数的情况下运行查询,没有任何问题,但有人警告说,这存在 SQL 注入攻击的风险,因此我正在重新设计该过程以使用参数运行。任何帮助表示赞赏。干杯

c# sql-server stored-procedures ado.net parameter-passing
1个回答
0
投票

感谢您所有有用的评论。根据 SQL Server 配置文件跟踪,问题似乎出在“Bizagi”内部,该参数发送参数两次,一次为空值,一次为要更新的实际值。我已经让我们的一位开发人员检查了代码,他们没有发现任何问题。无论如何,为所有的帮助干杯。

© www.soinside.com 2019 - 2024. All rights reserved.