0
問題是,我必須記錄一個「交易」是憑證標題(訂單表)和詳細信息(訂單明細表)..說作爲發票..表頭和物品(細節)的事情是,一個標題記錄您是表中的1個或多個項目的詳細信息。如何爲訂單和訂單詳細信息表(n個註冊表)創建交易?
的問題是:有沒有辦法通過N條記錄(參數集)
編輯。我打算從SQL SERVER開始並且不在應用程序客戶端中寫入此事務(存儲過程)
問題是,我必須記錄一個「交易」是憑證標題(訂單表)和詳細信息(訂單明細表)..說作爲發票..表頭和物品(細節)的事情是,一個標題記錄您是表中的1個或多個項目的詳細信息。如何爲訂單和訂單詳細信息表(n個註冊表)創建交易?
的問題是:有沒有辦法通過N條記錄(參數集)
編輯。我打算從SQL SERVER開始並且不在應用程序客戶端中寫入此事務(存儲過程)
您需要在客戶端(例如C#應用程序)的連接上打開事務,而不是在數據庫中。僞代碼:
下面是來自微軟的例子,略作修改,說明你的具體情況: http://msdn.microsoft.com/en-us/library/2k2hy99x(v=VS.100).aspx
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
// Start a local transaction.
SqlTransaction sqlTran = connection.BeginTransaction();
// Enlist a command in the current transaction.
SqlCommand command = connection.CreateCommand();
command.Transaction = sqlTran;
try
{
// Execute two separate commands.
command.CommandText =
"INSERT INTO Order ...";
command.ExecuteNonQuery();
//注意:你的命令或許應該返回新訂單的ID,這樣你就可以將它傳遞給OrderItem插入在下面;在這種情況下,您可能需要使用command.ExecuteScalar()或command.ExecuteReader()來返回ID;在最簡單的情況下,您可以執行與「SELECT @@ SCOPE_IDENTITY()」作爲文本另一個命令,但它要好得多寫一個存儲過程來處理您的插入(並返回ID)
foreach (var item in order.Items)
{
command.CommandText = "INSERT INTO OrderItem ... ";
command.ExecuteNonQuery();
}
// Commit the transaction.
sqlTran.Commit();
}
catch (Exception ex)
{
// Handle the exception if the transaction fails to commit.
Console.WriteLine(ex.Message);
try
{
// Attempt to roll back the transaction.
sqlTran.Rollback();
}
catch (Exception exRollback)
{
// Throws an InvalidOperationException if the connection
// is closed or the transaction has already been rolled
// back on the server.
Console.WriteLine(exRollback.Message);
}
}
}
這當然可以被完成,但如何取決於你使用什麼數據訪問方法。這是使用純'SqlCommand'或類似linq-to-sql? –
不,我在我的客戶端應用程序中使用數據集。我只調用存儲過程名稱 – Darf
在SQL 2008/.Net中,您可以將數據錶轉儲到SQL中;看到這個如何http://www.eggheadcafe.com/community/ado/10/10138579/passing-dataset-to-stored-procedure.aspx – u07ch