Tôi có một thường trình sử dụng vòng lặp đệ quy để chèn các mục vào cơ sở dữ liệu SQL Server 2005 Cuộc gọi đầu tiên khởi tạo vòng lặp được bao bọc trong một giao dịch bằng TransactionScope. Khi tôi lần đầu tiên gọi ProcessItem, dữ liệu myItem được chèn vào cơ sở dữ liệu như mong đợi. Tuy nhiên khi ProcessItem được gọi từ ProcessItemLinks hoặc ProcessItemComments, tôi nhận được lỗi sau.Tại sao thao tác TransactionScope không hợp lệ?
“Các hoạt động không hợp lệ cho tình trạng giao dịch”
Tôi đang chạy này trong debug với VS 2008 trên Windows 7 và có các MSDTC chạy để cho phép các giao dịch phân tán. Mã bên dưới không phải là mã sản xuất của tôi nhưng được đặt chính xác như nhau. AddItemToDatabase là một phương thức trên một lớp mà tôi không thể sửa đổi và sử dụng một ExecuteNonQuery chuẩn() để tạo ra một kết nối sau đó đóng và hủy bỏ khi đã hoàn tất.
Tôi đã xem các bài đăng khác trên đây và Internet và vẫn không thể giải quyết vấn đề này. Bất kì sự trợ giúp nào đều được đánh giá cao.
using (TransactionScope processItem = new TransactionScope())
{
foreach (Item myItem in itemsList)
{
ProcessItem(myItem);
}
processItem.Complete();
}
private void ProcessItem(Item myItem)
{
AddItemToDatabase(myItem);
ProcessItemLinks(myItem);
ProcessItemComments(myItem);
}
private void ProcessItemLinks(Item myItem)
{
foreach (Item link in myItem.Links)
{
ProcessItem(link);
}
}
private void ProcessItemComments(Item myItem)
{
foreach (Item comment in myItem.Comments)
{
ProcessItem(comment);
}
}
Đây là phần trên cùng của dấu vết ngăn xếp. Rất tiếc, tôi không thể hiển thị việc xây dựng đến thời điểm này như thông tin nhạy cảm của công ty mà tôi không thể tiết lộ.
at System.Transactions.TransactionState.EnlistPromotableSinglePhase(InternalTransaction tx, IPromotableSinglePhaseNotification promotableSinglePhaseNotification, Transaction atomicTransaction)
at System.Transactions.Transaction.EnlistPromotableSinglePhase(IPromotableSinglePhaseNotification promotableSinglePhaseNotification)
at System.Data.SqlClient.SqlInternalConnection.EnlistNonNull(Transaction tx)
at System.Data.SqlClient.SqlInternalConnection.Enlist(Transaction tx)
at System.Data.SqlClient.SqlInternalConnectionTds.Activate(Transaction transaction)
at System.Data.ProviderBase.DbConnectionInternal.ActivateConnection(Transaction transaction)
at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
at System.Data.SqlClient.SqlConnection.Open()
Bạn có thể đăng stack trace của ngoại lệ? –
Tôi đã thêm nhiều dấu vết như được cho phép. Hy vọng nó là đủ! – Cragly
Bạn có thể đăng toàn bộ ngoại lệ không? Đăng đầu ra của ex.ToString(), sau đó làm lại mọi thứ nhạy cảm. Tôi tự hỏi nếu có một InnerException hoặc hai. –