2013-10-17 31 views
3

任何人都可以告訴我,是否有充分的理由使用下面的兩個代碼塊之一而不是另一個?使用SqlCommand和範圍

using (SqlTransaction mySqlTransaction = mySqlConnection.BeginTransaction) 
{ 
    using (SqlCommand mySqlCmd = 
     new SqlCommand("First of many SQL statements here", mySqlConnection, mySqlTransaction) 
    { 
     mySqlCmd.Parameters.Add("@MyFirstParm", SqlDbType.Int).Value = myFirstVal; 
     mySqlCmd.ExecuteNonQuery(); 
    } 

    using (SqlCommand mySqlCmd = 
     new SqlCommand("Second of many SQL statements here", mySqlConnection, mySqlTransaction) 
    { 
     mySqlCmd.Parameters.Add("@MySecondParm", SqlDbType.Int).Value = mySecondVal; 
     mySqlCmd.ExecuteNonQuery(); 
    } 

    . 
    . 
    . 

    sqlTransaction.Commit(); 
} 

using (SqlTransaction mySqlTransaction = mySqlConnection.BeginTransaction) 
{ 
    using (SqlCommand mySqlCmd = new SqlCommand("", mySqlConnection, mySqlTransaction) 
    { 
     mySqlCmd.Parameters.Add("@MyFirstParm", SqlDbType.Int).Value = myFirstVal; 
     mySqlCmd.Parameters.Add("@MySecondParm", SqlDbType.Int).Value = mySecondVal; 

     mySqlCmd.CommandText = "First of many SQL statements here"; 
     mySqlCmd.ExecuteNonQuery(); 

     mySqlCmd.CommandText = "Second of many SQL statements here"; 
     mySqlCmd.ExecuteNonQuery(); 

     . 
     . 
     . 
    } 

    sqlTransaction.Commit(); 
} 
+0

有多少個參數有任何查詢? –

+0

第二種方法結束時有多少個參數? – Steve

+0

沒錯。參數的數量可能很重要,因爲如果我錯了(對不起,如果我錯了),您可以通過提供查詢來面對錯誤消息,提供了太多的參數 –

回答

1

A的優點A:兩條獨立的命令比兩條語句使用相同的命令稍微混亂,並且您可以在不影響命令的情況下更改命令2的SQL命令重載1 B的優點:使用略少的資源和更少的代碼如果這對你很重要)

兩者的優點:可以將單個方法封裝在try catch中,以使兩個都必須成功才能提交事務,否則將回滾。

兩者的缺點:現代時代,在一個方法中硬編碼SQL是非常危險的,如果這些參數來自任何UI對象中的任何文本字段,那麼您的數據庫可能會因SQL注入攻擊而變得混亂。讓一個數據庫方法執行兩個單獨的語句而不僅僅是處理存儲過程中的語句更令人困惑。此外,使用存儲過程並將commandtype更改爲commandtype.storedprocedure將防止通過參數(大多數情況下)進入sql注入攻擊。有很多關於SQL注入的很棒的文章,這裏有一個相關的文章。

http://blogs.msdn.com/b/raulga/archive/2007/01/04/dynamic-sql-sql-injection.aspx

2

我會去與1,因爲你有一個新的一套每SqlCommand參數。

我也建議將這些轉換爲單獨的方法,或者甚至作爲存儲過程來執行。

+0

更改命令文本將重置Parameters集合,所以這不是一個好處。 –

+0

@JoelCoehoorn通過閱讀代碼就不那麼清楚了。 –

0

但對於您的情況,第三個選項可以是一個存儲過程,它需要2個參數並在內部執行所有語句。在這種情況下,你只需要一個executeNonQuery指令。

+1

我不喜歡將應用程序邏輯轉移到存儲過程中,如果您真的需要提高性能,只能親自做這件事。如果你這樣做,你也可以在那裏移動事務,只留下一個對存儲過程的調用。 –

+0

那麼......你在所呈現的快照中看到了什麼樣的應用程序邏輯?我只在這裏看到一個順序的命令執行。 而且我會爲存儲過程邏輯中不存在trasaction的觀點辯護。一個沒有事務的存儲過程在它的正文中可以用一系列代碼來調用,這些代碼可以用來處理事務本身。 –