【发布时间】:2018-10-21 20:04:42
【问题描述】:
我正在做一个用户注册页面。插入用户存储过程工作正常,在 SQL Server 和配置文件查看器中,输出参数返回@@Rowcount,从 C# 调用此存储过程时,它始终返回“0”。
我的存储过程是这样的:
ALTER PROCEDURE [CM].[usp_InsertUser]
@pEncrUserId NVARCHAR(max),
@pApplicationTypeId BIGINT,
@pLanguageId BIGINT,
@pUsername VARCHAR(15),
@pPassword NVARCHAR(max),
@pRecoverEmail VARCHAR(128),
@pCreatedBy BIGINT,
@pReturnId INT OUTPUT ,
@pErrorMessage NVARCHAR(Max) OUTPUT
AS
BEGIN TRY
INSERT INTO [CM].[tb_ApplicationUser] ([EncrUserId], [ApplicationTypeId],[LanguageId],
[UserName], [UserPassword], [RecoverEmail],
[CreatedBy], [StatusId], [ConcurId])
VALUES (@pEncrUserId, @pApplicationTypeId, @pLanguageId,
@pUsername, @pPassword, @pRecoverEmail,
@pCreatedBy, 1, NEWID())
SET @pReturnId = @@ROWCOUNT
END TRY
BEGIN CATCH
SET @pReturnID = @@ERROR;
SET @pErrorMessage = ERROR_MESSAGE();
END CATCH
还有我的 C# 代码:
cmd = dbClient.GetCommand("cm.usp_InsertUser", CommandType.StoredProcedure);
dbClient.AddParameter(cmd, "@pEncrUserId", DALayer.EnumEx.DBDataTypes.NVarChar, ParameterDirection.Input, 0, objInput.EncrUseId);
dbClient.AddParameter(cmd, "@pApplicationTypeId", DALayer.EnumEx.DBDataTypes.BigInt, ParameterDirection.Input, 150, objInput.ApplicationtypeId);
dbClient.AddParameter(cmd, "@pLanguageId", DALayer.EnumEx.DBDataTypes.BigInt, ParameterDirection.Input, 150, objInput.LanguageId);
dbClient.AddParameter(cmd, "@pUsername", DALayer.EnumEx.DBDataTypes.VarChar, ParameterDirection.Input, 15, objInput.UserName);
dbClient.AddParameter(cmd, "@pPassword", DALayer.EnumEx.DBDataTypes.NVarChar, ParameterDirection.Input, 0, objInput.Password);
dbClient.AddParameter(cmd, "@pRecoverEmail", DALayer.EnumEx.DBDataTypes.VarChar, ParameterDirection.Input, 150, objInput.RecoverEmail);
dbClient.AddParameter(cmd, "@pCreatedBy", DALayer.EnumEx.DBDataTypes.BigInt, ParameterDirection.Input, 150, objInput.CreatedBy);
dbClient.AddParameter(cmd, "@pReturnId", DALayer.EnumEx.DBDataTypes.BigInt, ParameterDirection.Output, 150);
dbClient.AddParameter(cmd, "@pErrorMessage", DALayer.EnumEx.DBDataTypes.NVarChar, ParameterDirection.Output, 150);
IDataReader dsTemp = dbClient.ExecuteDataReader(cmd);
returnID = Convert.ToInt64(dbClient.GetParameterValue(cmd, "@pReturnId"));
任何建议对我都有帮助。我不明白这有什么问题。此方法适用于项目的其他插入。
【问题讨论】:
-
为什么不改用SqlCommand.ExecuteNonQuery Method ()?它将返回受影响的行数。
-
需要调试
GetParameterValue方法。 -
可能不会有什么不同,但您在 SQL 中将其声明为
int,在 C# 代码中声明为bigint。 -
你的表有主键吗?您正在使用 INSERT 并且如果该行已经存在具有相同的主键,您将获得零返回,因为没有更改任何行。插入不会改变一行。然后您将需要使用更新。
-
什么是
dbClient?为什么不执行SELECT @@ROWCOUNT并读取结果输出?
标签: c# sql stored-procedures sqlclient idatareader