Varchar 值未传递到 SQL 服务器存储过程

Varchar value not passing into SQL Server stored procedure

以下是调用存储过程的代码:

SqlCommand commandSql = new SqlCommand("GetbyProgramID")

commandSql.CommandType = CommandType.StoredProcedure;

//commandSql.Parameters.Add("@program_id", SqlDbType.VarChar, 5, programID);
commandSql.Parameters.Add("@program_id", System.Data.SqlDbType.VarChar, 5).Value = programID;

SqlParameter returnValue = new SqlParameter("@result", SqlDbType.Int);
returnValue.Direction = ParameterDirection.Output;
commandSql.Parameters.Add(returnValue);

DBAccessHelper.Execute(commandSql);

var result = returnValue.Value != System.DBNull.Value ? returnValue.Value.ToString() : string.Empty;
return result;

这是我的存储过程:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[GetbyProgramID]
       @program_id  varchar,
       @result int OUTPUT 
AS 
BEGIN 
    SELECT @result = system_id 
    FROM dbo.agency_mapping 
    WHERE program_id = @program_id  

    RETURN
END

我的 C# 代码中的结果总是空值。

不确定我做错了什么。

我传递的值是正确的。

遗漏了什么重要的东西?

您已声明

ALTER PROCEDURE [dbo].[GetbyProgramID]
       @program_id  varchar,
       @result int OUTPUT 

这意味着您的存储过程接收到一个名为@program_id 的参数,大小为 1 个字符。可能是因为这个原因你的 SELECT 失败了。

尝试声明

ALTER PROCEDURE [dbo].[GetbyProgramID]
       @program_id  varchar(5),
       @result int OUTPUT 

来自您的 C# 代码。
不要删除 C# 代码中的大小,因为让 Sql 服务器引擎准备一个优化计划很有用,如果您第二次调用查询,可以重复使用该计划。

此处的模式信息:How Data Access code Affects Database Performances

将您的 SP 更改为

 @program_id  varchar(5)

编辑:根据Steve回答,我更新了删除参数大小的内容。