param和存储过程的转换无效

时间:2016-03-03 15:48:59

标签: c# sql stored-procedures

我正在尝试启动usign存储过程。好吧,我目前有一个查询只返回一个字符串的值。我似乎无法在这里看到我的错误。

sql如下:

BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

Declare @ReturnVal Varchar(20)

-- Insert statements for procedure here
set @ReturnVal = (select a.AccBCPublicId from [MyTable Goes Here] a where a.AccId = @ACCId)

return @ReturnVal   

END

using (SqlCommand sqlCommand = new SqlCommand("[dbo].[My Stored Procedure]", sqlConnection) { CommandType = CommandType.StoredProcedure })
  {
    //clean the starting 0's before sending. Originally had leading zeros
    sqlCommand.Parameters.Add(new SqlParameter("@ACCId", strAccId.TrimStart(Convert.ToChar("0"))));
    SqlParameter returnParam = new SqlParameter("@ReturnVal", SqlDbType.NVarChar, 20) {Direction = ParameterDirection.ReturnValue };
    sqlCommand.Parameters.Add(returnParam);

    sqlCommand.ExecuteNonQuery();   

    string bcAccount = (string)returnParam.Value;
 }

我一直收到以下错误。我确实看到为什么它看作int值类型。

Conversion failed when converting the varchar value 'bc:99988' to data type int.

1 个答案:

答案 0 :(得分:1)

使用RETURN T-SQL statement传递的值只能是整数表达式,不能传回字符串。似乎最简单的选择是使用ExecuteScalar

BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

select a.AccBCPublicId from [MyTable Goes Here] a where a.AccId = @ACCId

在您的代码中使用

using (SqlCommand sqlCommand = new SqlCommand(.....))
{
    sqlCommand.Parameters.Add(.....)
    object result = sqlCommand.ExecuteScalar();
    if(result != null)
        string bcAccount = result.ToString();
    ....
}