2013-08-22 124 views
1

例如我想要INSERT數據庫中的數據和UPDATE另一個表。我的代碼是這樣的如何在一個連接中創建兩個命令?

SqlConnection con = new SqlConnection("**"); 
con.Open(); 
SqlCommand cmd = con.CreateCommand(); 
cmd.CommandText = "INSERT Borrowbook VALUES (@StudentID, @ISBN, @Title, @Date)"; 
SqlParameter p1 = new SqlParameter("@StudentID", SqlDbType.NChar); 
p1.Value = textBox2.Text; 
cmd.Parameters.Add(p1); 
SqlParameter p2 = new SqlParameter("@ISBN", SqlDbType.NVarChar); 
p2.Value = textBox4.Text; 
cmd.Parameters.Add(p2); 
SqlParameter p3 = new SqlParameter("@Title", SqlDbType.VarChar); 
p3.Value = textBox3.Text; 
cmd.Parameters.Add(p3); 
SqlParameter p4 = new SqlParameter("@Date", SqlDbType.DateTime); 
p4.Value = dateTimePicker1.Text; 
cmd.Parameters.Add(p4);  
cmd.ExecuteNonQuery(); 
con.Close(); 
MessageBox.Show("The books has been successfully borrowed!", 
    "Information ... ", 
    MessageBoxButtons.OK, 
    MessageBoxIcon.Information, 
    MessageBoxDefaultButton.Button1); 
+1

你爲什麼不想在兩個單獨的命令中做到這一點? – FelProNet

+0

我不太明白有什麼問題。要創建兩個命令,你可以調用'con.CreateCommand()'兩次。 –

+0

'new SqlCommand(「query」,con);' –

回答

4

第一所以在發生異常時您的連接會關閉

using(SqlConnection con = new SqlConnection("**********************************************")) 
using(SqlCommand cmd = con.CreateCommand()) //The create command can happen before the open 
{ 
    con.Open(); 
    cmd.CommandText = "INSERT INTO Borrowbook ([Student ID], ISBN, Title, Date) VALUES ( @StudentID, @ISBN , @Title, @Date)"; 
    //(Snip adding parameters) 
    cmd.ExecuteNonQuery(); 
    //You don't need to call close if you are using "using" 
} 

這樣做有三種方法可以做到這一點。

您可以將兩個命令放在一個命令語句中。

using(SqlConnection con = new SqlConnection("**********************************************")) 
using(SqlCommand cmd = con.CreateCommand()) 
{ 
    con.Open(); 
    cmd.CommandText = @"INSERT INTO Borrowbook ([Student ID], ISBN, Title, Date) VALUES ( @StudentID, @ISBN , @Title, @Date); 
         INSERT INTO StudentActvitiy ([Student ID], Date) VALUES ( @StudentID, GETDATE())"; 
    //(Snip adding parameters) 
    cmd.ExecuteNonQuery(); 
} 

,或者你可以更改命令文本,並再次運行

using(SqlConnection con = new SqlConnection("**********************************************")) 
using(SqlCommand cmd = con.CreateCommand()) 
{ 
    con.Open(); 
    cmd.CommandText = "INSERT INTO Borrowbook ([Student ID], ISBN, Title, Date) VALUES ( @StudentID, @ISBN , @Title, @Date)"; 
    //(Snip adding parameters) 
    cmd.ExecuteNonQuery(); 

    cmd.CommandText = "INSERT INTO StudentActvitiy ([Student ID], Date) VALUES ( @StudentID, GETDATE())" 
    cmd.ExecuteNonQuery(); 
} 

,或者你可以做兩個命令

using(SqlConnection con = new SqlConnection("**********************************************")) 
using(SqlCommand cmd = con.CreateCommand()) 
using(SqlCommand cmd2 = con.CreateCommand()) 
{ 
    con.Open(); 
    cmd.CommandText = "INSERT INTO Borrowbook ([Student ID], ISBN, Title, Date) VALUES ( @StudentID, @ISBN , @Title, @Date)"; 
    //(Snip adding parameters) 
    cmd.ExecuteNonQuery(); 

    cmd2.CommandText = "INSERT INTO StudentActvitiy ([Student ID], Date) VALUES ( @StudentID, GETDATE())" 
    SqlParameter p21 = new SqlParameter("@StudentID", SqlDbType.NChar); 
    p21.Value = textBox2.Text; 
    cmd2.Parameters.Add(p21); 
    cmd2.ExecuteNonQuery(); 
} 

要做到Tim's solution這是一種第一的組合和第三。

using(SqlConnection con = new SqlConnection("**********************************************")) 
using(SqlCommand cmd = con.CreateCommand()) 
using(SqlCommand cmd2 = con.CreateCommand()) 
{ 
    con.Open(); 
    cmd.CommandText = @"INSERT INTO Borrowbook ([Student ID], ISBN, Title, Date) VALUES ( @StudentID, @ISBN , @Title, @Date); 
         SELECT CAST(SCOPE_IDENTITY AS INT);"; 
    //(Snip adding parameters) 
    var resultId = (int)cmd.ExecuteScalar(); 

    cmd2.CommandText = "INSERT INTO StudentActvitiy ([Student ID], Date, BorrowBookId) VALUES ( @StudentID, GETDATE(), @borrowBookId)" 
    SqlParameter p21 = new SqlParameter("@StudentID", SqlDbType.NChar); 
    p21.Value = textBox2.Text; 
    cmd2.Parameters.Add(p21); 

    SqlParameter p22 = new SqlParameter("@borrowBookId", SqlDbType.Int); 
    p22.Value = resultId; 
    cmd2.Parameters.Add(p22); 
    cmd2.ExecuteNonQuery(); 
} 
+0

+1使用語句和很好的例子。 – Khan

+0

使用statement = immediate +1 –

+0

在不需要它們之後立即處置'cmd'和'cmd2'會不會更好?在這種情況下,你甚至可以保持相同的名字(即'cmd')。 – Neolisk

1

你可以。在執行第二個命令之前,請不要關閉連接。

示例步驟:

  1. 創建新的連接
  2. 打開連接
  3. 創建命令1
  4. 添加PARAMS到指令1
  5. 執行命令1
  6. 創建命令2
  7. 添加PARAMS到命令2
  8. 執行命令2
  9. 關閉連接
  10. 處置項目
1

你可以做以下你真的應該使用語句使用所有的

 SqlConnection cn = new SqlConnection("********"); 
     string stmt = "insert projects(projectname) values('" + name + "')"; 
     string stmt1="update dept set deptid="+id; 

     SqlCommand cmd = new SqlCommand(stmt, cn); 
     sqlcommand cmd1=new sqlcommand(stmt1,cn);   

     cn.Open(); 
     cmd.ExecuteNonQuery(); 

     cmd1.ExecuteNonQuery(); 
     cn.close() 
+0

謝謝你的答案:) –

0

當我看到這樣的問題時,我幾乎總是問:「爲什麼不使用存儲過程?」您可以避免額外往返數據庫服務器。封裝事務邏輯更容易,並且它是執行基於數據的業務邏輯的好地方。技術答案很好,但是除非你被困在多數據庫平臺環境中,否則你仍然「做錯了」,但是在這種情況下,除非你編寫數據層,否則你可能做錯了。爲您處理數據庫差異。

我想我還應該補充說,無論您是使用存儲過程還是多重語句,都應該使用限定名稱dbo.tablename而不是表名來引用表等。這通過避免進程中不必要的安全檢查來優化性能,但對於使用客戶端生成的動態sql時的性能至關重要,因爲不要使用dbo。防止sql server重複使用已編譯的sql,並且如果頻繁調用,則會非常快速地填充已編譯的sql緩存。

相關問題