c# 在事务中检索插入的 ID

标签 c# asp.net sql-server transactions rollback

我有一堆我想在事务中插入的内容,这样我就可以在出现任何错误时回滚。现在我的问题是,对于某些插入,我需要前一个插入的 ID。但是,执行 var id = (int)command.ExecuteScalar(); 会引发异常(“对象引用未设置为对象的实例”)。如果我运行 command.ExecuteScalar() 而没有尝试分配结果,代码就可以正常工作。是否可以在提交交易前获取 ID?如果不是,我的替代方案是什么?

我的代码:

using (SqlConnection connection = new SqlConnection("ConnectionHere")
{
            connection.Open();

            SqlCommand command = connection.CreateCommand();
            SqlTransaction transaction;

            // Start a local transaction.
            transaction = connection.BeginTransaction();
            command.Connection = connection;
            command.Transaction = transaction;

            try
            {                    
                string insertStudent = "INSERT INTO Students (FirstName, MiddleName, LastName)" +
                " VALUES (@firstName, @middleName, @lastName)";

                command.CommandText = insertStudent;
                command.Parameters.AddWithValue("@firstName", application.FirstName);
                command.Parameters.AddWithValue("@middleName", application.MiddleName);
                command.Parameters.AddWithValue("@lastName", application.LastName);

                var id = (int) command.ExecuteScalar();//EXCEPTION THROWN HERE

                // Attempt to commit the transaction.
                transaction.Commit();
            }
            catch (Exception ex)
            {
                Console.WriteLine("Commit Exception Type: {0}", ex.GetType());
                Console.WriteLine("  Message: {0}", ex.Message);

                // Attempt to roll back the transaction.        
                transaction.Rollback();
            }
}

最佳答案

我假设 Students 表中的一列设置为标识列,并且您使用 SQL Server 2008+。

在这种情况下,您需要更改 SQL 语句以返回插入的标识值,如下所示:

  string insertStudent = "INSERT INTO Students (FirstName, MiddleName, LastName)" +
            " VALUES (@firstName, @middleName, @lastName);" +
            " SELECT SCOPE_IDENTITY();";

有关 SCOPE_IDENTITY 的更多信息可在此处找到:https://learn.microsoft.com/en-us/sql/t-sql/functions/scope-identity-transact-sql

关于c# 在事务中检索插入的 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49156748/

相关文章:

c# - .net Rx : in-order batch-processing of messages

c# - 无效的对象名称异常指的是我尚未创建的对象

ASP.NET 搜索引擎

asp.net - 为什么使用 SSL 时 IE 中的文件上传速度很慢?

asp.net - 在具有多个项目(API/服务/数据等)的解决方案中编写 SignalR 服务的最佳方法是什么?

python - SQLAlchemy、FreeTDS 和 MSSQL DBAPI 错误 : Conversion between 47 and -1 datatypes is not supported

c# - DataGrid WPF StackOverFlow 异常

c# - 如何将 < > 括起来的项目添加到文档注释中

java - 尝试持久化到 SQL Server 时 Spring Boot 应用程序挂起

sql-server - 使用 "There is a compilation error. Do you want to save anyway"消息保存后,C# 代码从脚本任务中消失