Dapper returns 阴性结果
Dapper returns negative result
我对 dapper return在 sp 调用中使用 -1 而不是 1 有点困惑。
存储过程如下:
CREATE PROCEDURE [dbo].[spIncrementUserAccessFailedCount]
@UserId INT,
@ConcurrencyStamp UNIQUEIDENTIFIER,
@IncrementCount INT OUTPUT,
@ConcurrencyStampNew UNIQUEIDENTIFIER OUTPUT
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY
IF NOT EXISTS(SELECT * FROM [dbo].[User] WHERE [UserId] = @UserId AND [ConcurrencyStamp] = @ConcurrencyStamp)
RAISERROR('ConcurrencyStamp is not valid.',18,1) WITH NOWAIT;
UPDATE [dbo].[User]
SET
@IncrementCount = [AccessFailedCount] = [AccessFailedCount] + 1,
@ConcurrencyStampNew = [ConcurrencyStamp] = NEWID()
WHERE [UserId] = @UserId
RETURN 1;
END TRY
BEGIN CATCH
THROW
END CATCH
END
这是我调用 sp 的 c# 代码:
public async Task IncrementAccessFailedCountAsync(User user)
{
DynamicParameters parms = new DynamicParameters();
parms.Add("UserId", user.UserId);
parms.Add("ConcurrencyStamp", user.ConcurrencyStamp);
parms.Add("IncrementCount", null, DbType.Int32, direction: ParameterDirection.Output);
parms.Add("ConcurrencyStampNew", null, DbType.Guid, direction: ParameterDirection.Output, size: 40);
var result = await _dataAcces.SaveData("dbo.spIncrementUserAccessFailedCount", parms, _connectionString.SqlIdentityConnectionName);
if (result == 1)
{
user.ConcurrencyStamp = parms.Get<Guid>("ConcurrencyStampNew");
user.AccessFailedCount = parms.Get<int>("IncrementCount");
}
}
这是我的小巧玲珑的包装纸:
public async Task<int> SaveData<U>(string sql, U parameters, string connectionStringName)
{
string connectionString = _configuration.GetConnectionString(connectionStringName);
using (IDbConnection connection = new SqlConnection(connectionString))
{
return await connection.ExecuteAsync(sql, parameters, commandType: CommandType.StoredProcedure);
}
}
但是结果值为-1。
FailedCount 和 ConcurencyStam 在数据库中已更改,但由于 if 块而未 returned。我知道 returns 受影响的行数和“SET NOCOUNT ON”,我认为它会 return 改为“RETURN 1”值。我可以强制它这样做吗?
问题是 Dapper 试图获取更改的行数,当您调用 PROCEDURE 时,命令更改的行数为 -1。你想从存储过程中获取 return 代码,你可以使用类似 this
在你的情况下它会是这样的;
public async Task<int> SaveData<U>(string sql, U parameters, string connectionStringName)
{
string connectionString = _configuration.GetConnectionString(connectionStringName);
using (IDbConnection connection = new SqlConnection(connectionString))
{
parameters.Add("RetVal", null, DbType.Int32, direction: ParameterDirection.ReturnValue);
var returnCode = connection.Execute(sql, parameters, commandType: CommandType.StoredProcedure);
return parameters.Get<int>("@RetVal");
}
}
我对 dapper return在 sp 调用中使用 -1 而不是 1 有点困惑。
存储过程如下:
CREATE PROCEDURE [dbo].[spIncrementUserAccessFailedCount]
@UserId INT,
@ConcurrencyStamp UNIQUEIDENTIFIER,
@IncrementCount INT OUTPUT,
@ConcurrencyStampNew UNIQUEIDENTIFIER OUTPUT
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY
IF NOT EXISTS(SELECT * FROM [dbo].[User] WHERE [UserId] = @UserId AND [ConcurrencyStamp] = @ConcurrencyStamp)
RAISERROR('ConcurrencyStamp is not valid.',18,1) WITH NOWAIT;
UPDATE [dbo].[User]
SET
@IncrementCount = [AccessFailedCount] = [AccessFailedCount] + 1,
@ConcurrencyStampNew = [ConcurrencyStamp] = NEWID()
WHERE [UserId] = @UserId
RETURN 1;
END TRY
BEGIN CATCH
THROW
END CATCH
END
这是我调用 sp 的 c# 代码:
public async Task IncrementAccessFailedCountAsync(User user)
{
DynamicParameters parms = new DynamicParameters();
parms.Add("UserId", user.UserId);
parms.Add("ConcurrencyStamp", user.ConcurrencyStamp);
parms.Add("IncrementCount", null, DbType.Int32, direction: ParameterDirection.Output);
parms.Add("ConcurrencyStampNew", null, DbType.Guid, direction: ParameterDirection.Output, size: 40);
var result = await _dataAcces.SaveData("dbo.spIncrementUserAccessFailedCount", parms, _connectionString.SqlIdentityConnectionName);
if (result == 1)
{
user.ConcurrencyStamp = parms.Get<Guid>("ConcurrencyStampNew");
user.AccessFailedCount = parms.Get<int>("IncrementCount");
}
}
这是我的小巧玲珑的包装纸:
public async Task<int> SaveData<U>(string sql, U parameters, string connectionStringName)
{
string connectionString = _configuration.GetConnectionString(connectionStringName);
using (IDbConnection connection = new SqlConnection(connectionString))
{
return await connection.ExecuteAsync(sql, parameters, commandType: CommandType.StoredProcedure);
}
}
但是结果值为-1。
FailedCount 和 ConcurencyStam 在数据库中已更改,但由于 if 块而未 returned。我知道 returns 受影响的行数和“SET NOCOUNT ON”,我认为它会 return 改为“RETURN 1”值。我可以强制它这样做吗?
问题是 Dapper 试图获取更改的行数,当您调用 PROCEDURE 时,命令更改的行数为 -1。你想从存储过程中获取 return 代码,你可以使用类似 this
在你的情况下它会是这样的;
public async Task<int> SaveData<U>(string sql, U parameters, string connectionStringName)
{
string connectionString = _configuration.GetConnectionString(connectionStringName);
using (IDbConnection connection = new SqlConnection(connectionString))
{
parameters.Add("RetVal", null, DbType.Int32, direction: ParameterDirection.ReturnValue);
var returnCode = connection.Execute(sql, parameters, commandType: CommandType.StoredProcedure);
return parameters.Get<int>("@RetVal");
}
}