Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将Linq的保存点设置为SQL并使用;否";执行命令?_C#_Linq To Sql_Transactions_Savepoints - Fatal编程技术网

C# 如何将Linq的保存点设置为SQL并使用;否";执行命令?

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();

它可以工作,但仅适用于ExecuteCommand。我想使用一个函数,因为我看不到保存点中发生了什么

执行怎么样

使用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);

执行程序怎么样

使用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