我在 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 注入攻击的风险,因此我正在重新设计该过程以使用参数运行。任何帮助表示赞赏。干杯
感谢您所有有用的评论。根据 SQL Server 配置文件跟踪,问题似乎出在“Bizagi”内部,该参数发送参数两次,一次为空值,一次为要更新的实际值。我已经让我们的一位开发人员检查了代码,他们没有发现任何问题。无论如何,为所有的帮助干杯。