2011-08-31 96 views
5
MySqlCommand cmd = new MySqlCommand 
        (@"INSERT INTO Table(field) VALUES('somevalue');" + 
        "SELECT * FROM table",cn); 

這對我來說很好,因爲我只是將這些語句傳遞給我的MySQL服務器。使用ExecuteReader而不是ExecuteNonQuery

插入時是否可以使用ExecuteReader() &更新&刪除?

我通常在那些上使用ExecuteNonQuery()

+5

希望您的真實代碼在每次插入時都不會真正從表中選擇所有行。這將擴大......糟糕。 –

+0

如果我嘗試從整個表格中「選擇」,它會真的殺死它的表現。我只是將其設置爲一個示例 –

+0

[SQLCommand.ExecuteReader()可能的重複不限於只讀語句](http://stackoverflow.com/questions/3348012/sqlcommand-executereader-does-not-restrict-to-只讀語句) – nawfal

回答

8

你就好了捆綁額外的INSERT與您的選擇具有的ExecuteReader沿()。這沒關係。

我看到兩件事情都可能不好啦...沒有代碼本身,而是你什麼表現簡化,並簡化代碼暗示一些潛在的不良行爲:

第一個不行的你的代碼看起來像可能正在使用字符串連接來將值替換到您的查詢中。事情是這樣的:

MySqlCommand cmd = new MySqlCommand 
       (@"INSERT INTO Table(field) VALUES('" + somevariable + "');" + 
       "SELECT * FROM table",cn); 

這是一個巨大的問題,因爲它會打開應用程序中的一個巨大的安全漏洞。相反,你需要使用的查詢參數,使代碼看起來更像是這樣的:

MySqlCommand cmd = new MySqlCommand 
       (@"INSERT INTO Table(field) VALUES(@somevalue);" + 
       "SELECT * FROM table",cn); 
cmd.Parameters.Add("@somevalue", SqlDbType.VarChar, 50).Value = somevariable; 

另一個潛在問題是,你的命令,更重要的是,你的連接,應被包裹在一個try/finally塊(或偏好使用塊),像這樣:

using (var cn = new MySqlConnection("...")) 
using (var cmd = new MySqlCommand("@INSERT INTO Table(field).... ", cn)) 
{ 
    cmd.Parameters.Add(...); 
    cn.Open(); 
    using (var rdr = cmd.ExecuteReader()) 
    { 
     while (rdr.Read()) 
     { 
      //... 
     } 
    } 
} 
+0

我總是在參數上傳遞'user'輸入以避免SQL注入並實踐異常處理。我只是舉一個例子來舉一個例子。因爲可以向我的服務器投擲批量查詢。感謝啓發。 –

3

的ExecuteReader

不要使用:當數據庫查詢是要提供確定到底是1 記錄。

用途:當數據庫查詢將提供一組記錄。它可能會搜索或報告 。

的ExecuteNonQuery

用途:當我們在談論一個單一的數據庫記錄 - 在更新, 插入,刪除,並通過id來獲取。

的ExecuteScalar

不要使用:當數據庫查詢返回一個值,這個值 可以被定義爲在T-SQL參數。 ExecuteNonQuery輸出 在這種情況下始終首選參數,因爲它更靈活,明天將有2個值,因此具有 ExecuteNonQuery我們不需要更改方法簽名。

用途:當數據庫查詢返回單個值並且此值不能將 定義爲輸出參數時,由於T-SQL類型限制爲 變量。

Reference

+0

OP引用MySQL的「MySqlCommand」類,而不是SQL Server。 –

+2

可疑的建議:'選擇正好一個記錄時使用ExecuteNon和輸出參數'?等待等待。您實際上建議我們在給定的單個結果行中爲每列聲明* n *輸出參數?殘酷的維修開發商。 –

1

如果由於結構的原因,你必須使用ExecuteReader然後繼續前進,只記得事後處置(關閉)的讀者。它對程序有一點影響,但它很可能僅限於.Net部分,大部分僅僅是附加類實例的內存消耗。事實上,某些ADO.Net提供商在內部使用ExecuteNonQuery後面的ExecuteReader

這裏更大的問題是插入查詢後的SELECT * FROM table部分。即使您沒有使用讀取器來讀取數據,它仍會消耗更多的資源來執行選擇查詢。在這裏,無論您使用ExecuteReader還是ExecuteNonQuery(除非您從閱讀器讀取,當然),MySQL應該沒有區別