Varchar值未传入SQL Server存储过程

时间:2015-02-27 17:56:27

标签: c# sql sql-server stored-procedures varchar

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

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#代码中得到一个空值。

不确定我做错了什么。

我传递的值是正确的。

缺少什么重要的东西?

2 个答案:

答案 0 :(得分:3)

您已宣布

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

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

请尝试声明

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

来自您的C#代码。
不要删除C#代码中的大小,因为让Sql Server Engine准备一个可以在第二次调用查询时可以重用的优化计划是很有用的。

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

答案 1 :(得分:0)

将您的SP更改为

 @program_id  varchar(5)

修改:根据Steve回答,我已更新删除参数大小。