【问题标题】:update multiple table using one query in SQL SERVER在 SQL SERVER 中使用一个查询更新多个表
【发布时间】:2013-01-03 09:43:21
【问题描述】:

我正在使用 SQL SERVER 2008 处理 asp.net(c#) 项目。我想使用一个查询更新三个表。请建议我如何做到这一点。谢谢

【问题讨论】:

    标签: asp.net sql-server c#-4.0 database


    【解决方案1】:

    你不能。更新语句适用于单个表。您必须为三个表编写三个不同的查询。

    您可以使用事务来确保您的更新语句是原子的。

    BEGIN TRANSACTION
    
    UPDATE Table1
    Set Field1 = '1';
    Where Field = 'value';
    
    UPDATE Table2
    Set Field1= '2'
    Where Field = 'value';
    
    UPDATE Table3
    Set Field1= '3'
    Where Field = 'value';
    
    COMMIT
    

    对于 C#,您可以使用 SqlTransaction。来自同一链接的示例(已修改)

    private static void ExecuteSqlTransaction(string connectionString)
    {
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();
    
            SqlCommand command = connection.CreateCommand();
            SqlTransaction transaction;
    
            // Start a local transaction.
            transaction = connection.BeginTransaction("SampleTransaction");
    
            // Must assign both transaction object and connection 
            // to Command object for a pending local transaction
            command.Connection = connection;
            command.Transaction = transaction;
    
            try
            {
                command.CommandText =
                    "UPDATE Table1 Set Field1 = '1' Where Field = 'value';";
                command.ExecuteNonQuery();
                command.CommandText =
                    "UPDATE Table2 Set Field1= '2' Where Field = 'value'";
                command.ExecuteNonQuery();
    
                command.CommandText =
                    "UPDATE Table3 Set Field1= '3' Where Field = 'value'";
                command.ExecuteNonQuery();
    
                // Attempt to commit the transaction.
                transaction.Commit();
                Console.WriteLine("Both records are written to database.");
            }
            catch (Exception ex)
            {
                Console.WriteLine("Commit Exception Type: {0}", ex.GetType());
                Console.WriteLine("  Message: {0}", ex.Message);
    
                // Attempt to roll back the transaction. 
                try
                {
                    transaction.Rollback();
                }
                catch (Exception ex2)
                {
                    // This catch block will handle any errors that may have occurred 
                    // on the server that would cause the rollback to fail, such as 
                    // a closed connection.
                    Console.WriteLine("Rollback Exception Type: {0}", ex2.GetType());
                    Console.WriteLine("  Message: {0}", ex2.Message);
                }
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      编写三个查询并将它们全部放入一个事务中,或者在一个存储过程中,或者在您的 c# 代码中使用 TransactionScope

      using System.Transactions;
      
      using( var ts = new TransactionScope() ){
      
        // execute your queries
      
        ts.Complete();
      }
      

      此处为完整示例:http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx

      【讨论】:

        【解决方案3】:

        其中一种方法是创建一个过程并在该过程中更新所有表。如果要插入所有三个或不插入它们,也可以使用事务。这是example

        您还可以从 C# 维护事务。这是一个例子 Transaction Stored Procedure C#
        示例

        using (var connection = new SqlConnection("your connectionstring"))
        {
            connection.Open();
            using (var transaction = connection.BeginTransaction())
            {
            try
            {
                using (var command1 = new SqlCommand("SP1Name", connection, transaction))
                {
                    command1.ExecuteNonQuery();
                }
                transaction.Commit();
            }
            catch
            {
                transaction.Rollback();
                throw;
            }
          }
        }
        

        【讨论】:

        • -1 “最好的方法”是一种反模式。这是完全不需要的 - 和维护问题,为每个可能的组合都这样做。这就是创建交易的目的。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-01-15
        • 1970-01-01
        • 1970-01-01
        • 2016-11-02
        • 2011-02-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多