var sqlCommand= "@ DELETE FROM table1 WHERE id = @Id
DELETE FROM table2 WHERE id = @Id ";
var isDeleted = db.Database
.ExecuteSqlCommand(sqlCommand, new SqlParameter("@Id", Id)) > 0;
問題是,如果第 2 條或任何其他陳述句失敗,則前一條陳述句保持不變,即已洗掉。
如果其中任何一個失敗并回傳false,我希望它反轉。
注意:它必須以相同的方式完成,而不是在存盤程序中。
uj5u.com熱心網友回復:
在 C# 中,您可以TransactionScope像這樣使用:
using (TransactionScope t = new TransactionScope(TransactionScopeOption.Required))
{
//do your work
if(everything is ok)
t.Complete();
}
uj5u.com熱心網友回復:
EF 使這對您來說非常容易:
var isDeleted = db.Database.ExecuteSqlCommand(
TransactionalBehavior.EnsureTransaction, // <=== new
sqlCommand, new SqlParameter("@Id", Id)) > 0;
uj5u.com熱心網友回復:
public void YourMethod(Sqlconnection conn,int id)
{
conn.Open();
using (SqlTransaction oTransaction = conn.BeginTransaction())
{
using (SqlCommand command = conn.CreateCommand())
{
string query =
"DELETE FROM table1 WHERE id=@Id;"
"DELETE FROM table2 WHERE id=@Id;";
command.CommandText = query;
command.Parameters.Add(new SqlParameter("@Id", SqlDbType.Int));
command.Transaction = oTransaction;
command.CommandType = CommandType.Text;
try
{
command.Parameters[0].Value = id;
command.ExecuteNonQuery();
//start transaction
oTransaction.Commit();
}
catch (Exception)
{
//if the transaction fails then rollback the data
oTransaction.Rollback();
//notice the call method that there was an exception
throw;
}
finally
{
// Close connection
conn.Close();
}
}
}
}
uj5u.com熱心網友回復:
這是更好的原因是多方面的使用BEGIN TRAN COMMIT,而不是使用客戶端事務。確保必須XACT_ABORT ON防止出現例外時的懸空事務
var sqlCommand= @"
SET XACT_ABORT ON;
BEGIN TRAN;
DELETE FROM table1 WHERE id = @Id;
DELETE FROM table2 WHERE id = @Id;
COMMIT TRAN;
";
var isDeleted = db.Database
.ExecuteSqlCommand(sqlCommand, new SqlParameter("@Id", Id)) > 0;
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/327008.html
標籤:C# sql-server 实体框架 sql命令
上一篇:.NET分析器規則集優先級
