background
I have some code which opens a sql connection, begins a transaction and performs some operations on the DB. This code creates an object from the DB (dequeue), gets some values and saves it back. The whole operation needs to take place in a transaction. All the code works perfectly without the transaction.
using (var connection = new SqlConnection(connectionString)) { connection.Open(); var transaction = connection.BeginTransaction(); try { var myObject = foo.Dequeue(connection, transaction); var url = myObj.GetFilePathUri(connection, transaction); //some other code that sets object values myObj.SaveMessage(connection, transaction); transaction.Commit(); //error here } catch(Exception ex) { transaction.Rollback(); //logging } finally { //cleanup code } }
dequeue method code
public foo Dequeue(SqlConnection connection, SqlTransaction transaction) { using (var command = new SqlCommand(DEQUEUE_SPROC, connection) {CommandType = CommandType.StoredProcedure, Transaction = transaction}) { var reader = command.ExecuteReader(); if (reader.HasRows) { reader.Read(); ID = (Guid) reader["ID"]; Name = reader["Name"].ToString(); return this; } return null; } }
Get Path Code
public string GetFilePathUri(SqlConnection connection, SqlTransaction transaction) { using (var command = new SqlCommand(FILEPATH_SPROC, connection) {CommandType = CommandType.StoredProcedure, Transaction = transaction}) { var reader = command.ExecuteReader(); if (reader.HasRows) { reader.Read(); return reader["Path"].ToString(); } return ""; } }
Save Code
public void SaveMessage(SqlConnection connection, SqlTransaction transaction) { using (var command = new SqlCommand(SAVE_SPROC, connection) {CommandType = CommandType.StoredProcedure, Transaction = transaction}) { command.Parameters.Add("@ID", SqlDbType.UniqueIdentifier).Value = ID; command.Parameters.Add("@Name", SqlDbType.VarChar).Value = Name; //other object params here command.ExecuteNonQuery(); } }
The problem
When transaction.Commit() is called, I get the following error:
The transaction operation cannot be performed because there are pending requests working on this transaction.
What am I doing wrong?
EDIT: Quick edit to say I have read the other questions about this problem on SO, but couldn't find any related to ADO.net
I have had this issue before and the problem was the reader needed to be closed. Try this:
public foo Dequeue(SqlConnection connection, SqlTransaction transaction) { using (var command = new SqlCommand(DEQUEUE_SPROC, connection) {CommandType = CommandType.StoredProcedure, Transaction = transaction}) { var reader = command.ExecuteReader(); if (reader.HasRows) { reader.Read(); ID = (Guid) reader["ID"]; Name = reader["Name"].ToString(); reader.Close();//Closing the reader return this; } return null; } } public string GetFilePathUri(SqlConnection connection, SqlTransaction transaction) { string filePathUri = ""; using (var command = new SqlCommand(FILEPATH_SPROC, connection) {CommandType = CommandType.StoredProcedure, Transaction = transaction}) { var reader = command.ExecuteReader(); if (reader.HasRows) { reader.Read(); filePathUri = reader["Path"].ToString(); } reader.Close();//Closing the reader } return filePathUri; }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With