【问题标题】:How-to update 2 table in one query如何在一个查询中更新 2 个表
【发布时间】:2014-05-10 05:02:10
【问题描述】:

我有两张桌子:

Login 具有 4 个属性:

 1. NRIC
 2. NAME
 3. PASSWORD
 4. TYPE (USER / ADMIN)

DETAILS 有 4 个属性:

 1. NRIC
 2. NAME
 3. PASSWORD
 4. EMAIL

如果表 DETAILS 已更新,我希望表 LOGIN 被更新。

例如,如果表 DETAILS 中的 password 已更新,则假定表 LOGIN 也应更新。

SQLCmd.CommandText = "UPDATE DETAILS set PASSWORD='" & TextBoxPassword.Text & "',EMAIL='" & TextBoxEmail.Text & "' WHERE NRIC='" & myVar2 & "'"

如何同时更新它们?

【问题讨论】:

    标签: sql-server vb.net sql-update


    【解决方案1】:

    为此使用SqlTransaction,以下是参考代码:

    C#:

        SqlConnection conn = new SqlConnection("[Your connection string]");
        conn.Open();
        SqlTransaction Trans = conn.BeginTransaction();
        SqlCommand SQLCmd = new SqlCommand("",conn);
        SQLCmd.Transaction = Trans;
        try
        {
            SQLCmd.CommandText = "UPDATE DETAILS set PASSWORD='" & TextBoxPassword.Text & "',EMAIL='" & TextBoxEmail.Text & "' WHERE NRIC='" & myVar2 & "'";
            SQLCmd.ExecuteNonQuery();
            SQLCmd.CommandText = "UPDATE Login  set PASSWORD='" & TextBoxPassword.Text & "' WHERE NRIC='" & myVar2 & "'";
            SQLCmd.ExecuteNonQuery();
            Trans.Commit();
    
        }
        catch
        {
            Trans.Rollback();
        }
        finally {
            conn.Close();
    
        } 
    

    VB:

    Dim conn As New SqlConnection("[Your connection string]")
    conn.Open()
    Dim Trans As SqlTransaction = conn.BeginTransaction()
    Dim SQLCmd As New SqlCommand("", conn)
    SQLCmd.Transaction = Trans
    Try
      SQLCmd.CommandText = "UPDATE DETAILS set PASSWORD='" And TextBoxPassword.Text And "',EMAIL='" And TextBoxEmail.Text And "' WHERE NRIC='" And myVar2 And "'"
      SQLCmd.ExecuteNonQuery()
      SQLCmd.CommandText = "UPDATE Login  set PASSWORD='" And TextBoxPassword.Text And "' WHERE NRIC='" And myVar2 And "'"
      SQLCmd.ExecuteNonQuery()
    
      Trans.Commit()
    Catch
      Trans.Rollback()
    Finally
    
      conn.Close()
    End Try
    

    【讨论】:

    • 如果您将其更改为参数化 sql,我会给您一个 +1。
    【解决方案2】:

    首先更新详细信息表。 然后提交更改。 然后更新登录表。 交易:D

    【讨论】:

      【解决方案3】:
      MySQL = "DECLARE @NumberOfRowsUpdated INT" & vbcrlf
      MySQL &= "" & vbcrlf 
      MySQL &= "UPDATE details" & vbcrlf 
      MySQL &= "SET password = '@password'," & vbcrlf 
      MySQL &= "    email = '@email'" & vbcrlf 
      MySQL &= "WHERE NRIC = '@nric'" & vbcrlf 
      MySQL &= "" & vbcrlf 
      MySQL &= "SELECT @NumberOfRowsUpdated = @@ROWCOUNT" & vbcrlf 
      MySQL &= "" & vbcrlf 
      MySQL &= "IF @NumberOfRowsUpdated > 0" & vbcrlf 
      MySQL &= "BEGIN" & vbcrlf 
      MySQL &= "    UPDATE LOGIN" & vbcrlf 
      MySQL &= "    SET password = '@password'," & vbcrlf 
      MySQL &= "        email = '@email'" & vbcrlf 
      MySQL &= "    WHERE NRIC = '@nric'" & vbcrlf 
      MySQL &= "END" & vbcrlf 
      
      MySQL = MySQL.Replace("@password",TextBoxPassword.Text).Replace("@email", TextBoxEmail.Text).Replace("@nric", myVar2)
      
      SqlCmd.Commandtext = MySQL
      SqlCmd.ExecuteNonQuery
      

      已经使用“提交和回滚”解决方案发布答案​​的人是错误的。这些解决方案不考虑实际执行的查询“更新”详细信息。此解决方案确保在执行第二个查询之前,第一个查询实际上“更新”了一行的详细信息。

      【讨论】:

        【解决方案4】:

        这是比 SQL 解决方案更 VB 的代码:

        Dim intTotalRowsUpdated As Integer
        SQLCmd.CommandText = "UPDATE DETAILS set PASSWORD='" & TextBoxPassword.Text & "',EMAIL='" & TextBoxEmail.Text & "' WHERE NRIC='" & myVar2 & "'"
        intTotalRowsUpdated = SQLCmd.ExecuteNonQuery()
        If intTotalRowsUpdated > 0 Then
            SQLCmd.CommandText = "UPDATE login set PASSWORD='" & TextBoxPassword.Text & "',EMAIL='" & TextBoxEmail.Text & "' WHERE NRIC='" & myVar2 & "'"
            SQLCmd.ExecuteNonQuery
        End If
        

        【讨论】:

          【解决方案5】:

          您可以使用存储过程来执行此任务。 像下面这样,

          CREATE PROC proc_UpdateProcedure    
          @PASSWORD VARCHAR(100),     
          @NRIC INT    
          AS    
          DECLARE @Ret INT  
          
          BEGIN TRANSACTION    
           BEGIN TRY  
            -- UPDATE DETAILS TABLE  
            UPDATE DETAILS SET PASSWORD = @PASSWORD WHERE NRIC = @NRIC
          
            -- UPDATE Login TABLE
            UPDATE Login SET PASSWORD = @PASSWORD WHERE NRIC = @NRIC 
          
            COMMIT TRANSACTION  
            SET @Ret = 1  
            SELECT @Ret  
           END TRY  
           BEGIN CATCH   
            ROLLBACK TRANSACTION  
            SET @Ret = 0  
            SELECT @Ret  
           END CATCH  
          

          【讨论】:

            【解决方案6】:

            如果您真的想在更新另一个表时更新一个表,您可能需要考虑一个触发器:

            create trigger trigUpdateDetails
            on details
            after update
            as
            begin
                update login
                set 
                    password=ins.password
                from login td
                join inserted ins on td.nric = ins.nric
            end
            

            此触发器导致详细信息表的任何更新也更新登录表的密码字段,无论更新源自客户端应用程序还是在数据库级别运行的语句。

            更多信息:

            http://msdn.microsoft.com/en-us/magazine/cc164047.aspx

            文章有点过时,但文章中的信息仍然相关。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-05-09
              • 2021-01-15
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多