簡體   English   中英

使用ExecuteReader而不是ExecuteNonQuery

[英]using ExecuteReader instead of ExecuteNonQuery

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

這對我很好,因為我只是將這些語句傳遞給我的MySQL服務器。

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

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

您只需將額外的INSERT與SELECT與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())
        {
            //...
        }
    }
}

的ExecuteReader

不要使用:當數據庫查詢提供確切的1條記錄時。

使用:當數據庫查詢要提供一組記錄時。 它可能是搜索或報告。

的ExecuteNonQuery

使用:當我們談論單個數據庫記錄時 - 在更新,插入,刪除和按ID獲取。

的ExecuteScalar

不要使用:當數據庫查詢返回單個值時,此值可以在T-SQL中定義為參數。 在這種情況下,帶輸出參數的ExecuteNonQuery總是首選,因為它更靈活,明天會有2個值因此具有ExecuteNonQuery,我們不需要更改方法簽名。

使用:當數據庫查詢返回單個值且該值不能定義為輸出參數時,因為變量的T-SQL類型限制。

參考

如果為了構造,你必須使用ExecuteReader然后繼續,只需記住之后處理(關閉)讀者。 它對程序有一點影響,但很可能只限於.Net部分,主要是附加類實例的內存消耗。 實際上,某些ADO.Net提供程序在內部使用ExecuteNonQuery后面的ExecuteReader

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM