C# 如何将Linq的保存点设置为SQL并使用;否";执行命令?
它可以工作,但仅适用于ExecuteCommand。我想使用一个函数,因为我看不到保存点中发生了什么 执行怎么样 使用DataContext.ExecuteQuery,您可以将文本发送到数据库中,就像ExecuteCommand一样,但您可以从该文本返回查询结果C# 如何将Linq的保存点设置为SQL并使用;否";执行命令?,c#,linq-to-sql,transactions,savepoints,C#,Linq To Sql,Transactions,Savepoints,它可以工作,但仅适用于ExecuteCommand。我想使用一个函数,因为我看不到保存点中发生了什么 执行怎么样 使用DataContext.ExecuteQuery,您可以将文本发送到数据库中,就像ExecuteCommand一样,但您可以从该文本返回查询结果 TransactionScope TransactionABC = new TransactionScope(); try { context.Connection.Open();
TransactionScope TransactionABC = new TransactionScope();
try
{
context.Connection.Open();
{
context.ExecuteCommand("insert into test (test) values (1)")
context.SubmitChanges();
context.ExecuteCommand("savepoint test");
context.ExecuteCommand("insert into test (test) values (2)")
context.SubmitChanges();
context.ExecuteCommand("rollback to test");
}
TransactionABC.Complete();
TransactionABC.Dispose();
}
catch (Exception ec)
{
MessageBox.Show(" ", ec.Message);
}
finally
{
context.Connection.Close();
}
IEnumerable results=ExecuteQuery(@)
声明@Table表(Id int)
插入到@Table SELECT{0}
插入到@Table SELECT{1}
从表“101,-101”中选择Id;
IEnumerable results=ExecuteQuery(@)
回滚事务
挑选*
来自客户
其中ID={0}”,myId);
执行程序怎么样
使用DataContext.ExecuteQuery,您可以将文本发送到数据库中,就像ExecuteCommand一样,但您可以从该文本返回查询结果
TransactionScope TransactionABC = new TransactionScope();
try
{
context.Connection.Open();
{
context.ExecuteCommand("insert into test (test) values (1)")
context.SubmitChanges();
context.ExecuteCommand("savepoint test");
context.ExecuteCommand("insert into test (test) values (2)")
context.SubmitChanges();
context.ExecuteCommand("rollback to test");
}
TransactionABC.Complete();
TransactionABC.Dispose();
}
catch (Exception ec)
{
MessageBox.Show(" ", ec.Message);
}
finally
{
context.Connection.Close();
}
IEnumerable results=ExecuteQuery(@)
声明@Table表(Id int)
插入到@Table SELECT{0}
插入到@Table SELECT{1}
从表“101,-101”中选择Id;
IEnumerable results=ExecuteQuery(@)
回滚事务
挑选*
来自客户
其中ID={0}”,myId);
我建议不要这样做。这不一定是你想听到的,但特别是当与TransactionScope
混合使用时,保存积分并不是一个好主意TransactionScope
s可以嵌套,但第一次回滚会毁掉一切,提交只发生在最外层的事务上
在我能想到的大多数情况下,最好先清理数据。你也可以(也应该)在安全网中使用违禁品,但如果你触碰了安全网,就要假设出现了大问题,然后回滚所有内容
嵌套事务的示例:
IEnumerable<int> results = ExecuteQuery<int>(@"
DECLARE @Table TABLE(Id int)
INSERT INTO @Table SELECT {0}
INSERT INTO @Table SELECT {1}
SELECT Id FROM Table", 101, -101);
IEnumerable<Customer> results = ExecuteQuery<Customer>( @"
Rollback transaction
SELECT *
FROM Customer
WHERE ID = {0}", myId);
在上面,DebitCreditAccount
是原子的-我们要么添加账户交易并更新估计余额,要么两者都不更新。如果这是唯一的事务,那么它将在该方法的末尾提交
但是,在
Transfer
方法中,我们创建了另一个外部事务;我们将执行两个DebitCreditAccount
,或两个都不执行。这里,内部trans.Complete()
(在DebitCreditAccount
中)不会提交db事务,因为存在外部事务。它只是说“我很高兴”。相反,如果任何一个内部事务被中止(Dispose()
调用而没有Complete()
),那么外部事务将立即回滚,并且该事务将拒绝任何额外的工作。只有在没有内部事务被中止的情况下,才会提交外部事务,并对外部事务调用Complete()
。我建议不要这样做。这不一定是你想听到的,但特别是当与TransactionScope
混合使用时,保存积分并不是一个好主意TransactionScope
s可以嵌套,但第一次回滚会毁掉一切,提交只发生在最外层的事务上
在我能想到的大多数情况下,最好先清理数据。你也可以(也应该)在安全网中使用违禁品,但如果你触碰了安全网,就要假设出现了大问题,然后回滚所有内容
嵌套事务的示例:
IEnumerable<int> results = ExecuteQuery<int>(@"
DECLARE @Table TABLE(Id int)
INSERT INTO @Table SELECT {0}
INSERT INTO @Table SELECT {1}
SELECT Id FROM Table", 101, -101);
IEnumerable<Customer> results = ExecuteQuery<Customer>( @"
Rollback transaction
SELECT *
FROM Customer
WHERE ID = {0}", myId);
在上面,DebitCreditAccount
是原子的-我们要么添加账户交易并更新估计余额,要么两者都不更新。如果这是唯一的事务,那么它将在该方法的末尾提交
但是,在
Transfer
方法中,我们创建了另一个外部事务;我们将执行两个DebitCreditAccount
,或两个都不执行。这里,内部trans.Complete()
(在DebitCreditAccount
中)不会提交db事务,因为存在外部事务。它只是说“我很高兴”。相反,如果任何一个内部事务被中止(Dispose()
调用而没有Complete()
),那么外部事务将立即回滚,并且该事务将拒绝任何额外的工作。只有在没有内部事务被中止时,才会提交外部事务,并对外部事务调用和Complete()
。您真的想使用事务范围。否则,当你得到一个异常时,你就让事务保持打开状态——这是很糟糕的。它应该使用(var-tran=new TransactionScope()){/*code*/tran.Complete();}
-然后在退出时正确地处理成功和失败,只有成功调用Complete()
。您确实想使用事务范围。否则,当你得到一个异常时,你就让事务保持打开状态——这是很糟糕的。它应该使用(var-tran=new TransactionScope()){/*code*/tran.Complete();}
-然后在退出时正确处理成功和失败,只有成功调用Complete()
。感谢您的回答!你能给我一个嵌套事务的示例吗?谢谢Nik@Mark谢谢你的密码。如果这两个内部事务都不起作用,我会得到一个异常。这个嵌套事务与保存点几乎相同吗?我会说不!我正在寻找一个与保存点相同但没有ExecuteCommand的代码!谢谢Nik@nik-不完全正确:回滚内部事务后,无法完成外部事务。有了保存点,你就可以做到。谢谢马克的回答!你能给我一个嵌套事务的示例吗?谢谢Nik@Mark谢谢你的密码。如果这两个内部事务都不起作用,我会得到一个异常。这个嵌套事务与保存点几乎相同吗?我会说不!我正在寻找一个与保存点相同但没有ExecuteCommand的代码!Tha