c# - 强类型数据集不从存储过程中检索返回值

标签 c# stored-procedures ado.net strongly-typed-dataset

我有一个强类型数据集,它使用 DBDirectMethods 通过调用存储过程将数据插入到数据库中。存储过程返回新创建的记录的主键。这是一个示例存储过程:

CREATE PROCEDURE dbo.CreateUser
(
    @UserName   VARCHAR(50)
    @Password   VARCHAR(50)
)
AS

SET NOCOUNT OFF

DECLARE @UserID INT

BEGIN TRANSACTION

INSERT INTO dbo.Users (UserName, Password) VALUES (@UserName, @Password)

SET @UserID = SCOPE_IDENTITY()

INSERT INTO dbo.Users_History (UserID, Status, TimeStamp) VALUES (@UserID, 'C', GETUTCDATE())

COMMIT TRANSACTION

RETURN @UserID

GO

如果我从 SSMS 执行存储过程,则会创建用户帐户、更新历史表并返回主键。如果我使用强类型数据集运行我的应用程序并让 SQL Profiler 运行,我可以看到相同的代码正在执行;但是,数据集返回 -1 作为主键并破坏了应用程序。

在 VS 生成的表适配器代码中,相关行是:

this._adapter.InsertCommand.CommandText = "dbo.CreateUser";
this._adapter.InsertCommand.CommandType = global::System.Data.CommandType.StoredProcedure;
this._adapter.InsertCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@RETURN_VALUE", global::System.Data.SqlDbType.Int, 4, global::System.Data.ParameterDirection.ReturnValue, 10, 0, null, global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
this._adapter.InsertCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@UserName", global::System.Data.SqlDbType.VarChar, 50, global::System.Data.ParameterDirection.Input, 0, 0, "UserName", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
this._adapter.InsertCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@Password", global::System.Data.SqlDbType.VarChar, 50, global::System.Data.ParameterDirection.Input, 0, 0, "Password", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));

try {
    int returnValue = this.Adapter.InsertCommand.ExecuteNonQuery();
    return returnValue;
}
finally {
    if ((previousConnectionState == global::System.Data.ConnectionState.Closed)) {
        this.Adapter.InsertCommand.Connection.Close();
    }
}

这只是 VS 通常生成的标准样板代码 - 没有任何内容经过手动编辑。它只是不获取返回值。

我运行的是带有 SQL 2008 R2 SP1 Express 的 Windows 7。

最佳答案

根据内存,这里的问题是值 ExecuteNonQuery () 返回的是受查询影响的行数。

相反,您的返回值应该可以通过以下方式访问:

InsertCommand.Parameters["@RETURN_VALUE"].Value;

InsertCommand.Parameters[0].Value;

此外,您可以尝试将返回参数名称更改为 @UserID 而不是 @RETURN_VALUE,但它应该仍然可以正常工作。

关于c# - 强类型数据集不从存储过程中检索返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11824550/

相关文章:

sql server 2008,不能在子查询中使用order by

c# - DataAdapter:更新无法找到 TableMapping ['Table' ] 或 DataTable 'Table'

c# - ubuntu linux 上的虚拟 socat 串口和 c#

c# - 使用反射调用控件的 Validate() 方法

php - 在 PHP 中执行存储过程后调用 odbc_fetch_array 给出错误 [Microsoft][ODBC SQL Server Driver]Invalid Descriptor Index

oracle - 从 ADO.NET 调用存储过程时,不能将类型为 NVarChar 的 OracleParameter 与输出的 ParameterDirection 一起使用

.net - 为什么我的 iSeries/ASP.NET MVC 4 应用程序中没有重用连接?

c# - 如何使用 Not In datatable.select

C# 将文本转语音保存到MP3文件

c# - 有什么方法可以在没有 Debug模式的情况下运行 .net 核心 Web 应用程序?