使用Dapper调用SQL存储过程

3
我有以下SQL存储过程:
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[GetNextNumberTest]
@NEWNUMBER varchar(100) OUTPUT
AS
BEGIN
    SET NOCOUNT ON;
    SET @NEWNUMBER = 'ABC00001'
    RETURN 1
END   

我正在尝试使用dapper读取NENUMBER值,以下是我的代码:

private string GetNextNumber()
{
    var dynamicParams = new DynamicParameters();
    dynamicParams.Add("rval", DbType.Int32, direction: ParameterDirection.ReturnValue);
    dynamicParams.Add("NEWNUMBER", DbType.String, direction: ParameterDirection.Output);
    var data = db.QueryMultiple("GetNextNumberTest", dynamicParams, commandType:    CommandType.StoredProcedure);
    var result = dynamicParams.Get<string>("NEWNUMBER");
    return result;
}

但我总是收到以下错误提示。
An exception of type 'System.Data.SqlClient.SqlException' occurred in Dapper.dll but was    not handled in user code

Additional information: Error converting data type varchar to int.

任何帮助都会受到高度赞赏。
1个回答

1

多重使用错误:

  1. DbType.Int32 / DbType.String 作为 而不是 数据类型 进行传递
  2. 如果您没有传递字符串值,则需要给出长度提示
  3. 此处应该使用 Execute,而不是 QueryMultiple
  4. 使用 Execute 的返回值来表示存储过程的返回值(这并不是 ADO.NET 的工作方式;那里的返回值理论上是受影响的行数,但通常是一个无意义的数字)

因此:

dynamicParams.Add("rval", dbType: DbType.Int32,
    direction: ParameterDirection.ReturnValue);
dynamicParams.Add("NEWNUMBER", dbType: DbType.String,
    direction: ParameterDirection.Output, size: 100);
db.Execute("GetNextNumberTest", dynamicParams,
    commandType: CommandType.StoredProcedure);
var rval = dynamicParams.Get<int>("rval");
var result = dynamicParams.Get<string>("NEWNUMBER");

非常感谢。非常感激您的帮助。 - Nalin Wickramasinghe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接