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

これは私のMySQLサーバーにしか渡されないので、これはうまく動作します。ExecuteNonQueryの代わりにExecuteReaderを使用する

& &を削除すると、ExecuteReader()を挿入しても問題ありませんか?

私は通常ExecuteNonQuery()を使用します。

+5

実際のコードでは、実際にはすべての行がテーブルからすべて選択されないことを願っています。それは貧弱なスケールになります。 –

+0

テーブル全体から「SELECT」を実行しようとすると、パフォーマンスが大幅に低下します。私はちょうど例として –

+0

の可能な複製[SQLCommand.ExecuteReader()は読み取り専用ステートメントに制限されていません](http://stackoverflow.com/questions/3348012/sqlcommand-executereader-does-not-restrict-to- read-only-statements) – nawfal

答えて

8

あなただけの罰金)のExecuteReader(とあなたのSELECTと一緒に余分なINSERTをバンドルしています。これは大丈夫です。

私はいくつかの潜在的な貧しい慣行に潜在的に大丈夫ではない2つの事柄...コード自体に何を見ていますが、何があったが簡素化され、単純化されたコードヒント:

最初ではない大丈夫さあなたのコードはのように見えるかもしれませんあなたのクエリに値を置き換える文字列連結を使用している可能性があります。このような何か:

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

SQLインジェクションを避け、例外処理を練習するために、私は常にパラメータで 'user'入力を渡します。私は例としてこれを引用します。以来、私のサーバーにバッチクエリをスローするのは大丈夫です。啓発に感謝します。 –

3

のExecuteReader

使用しないでください:データベースのクエリは、必ず正確に1 記録を提供するために起こっているとき。

使用:データベースクエリが一連のレコードを提供する場合。それは かもしれない検索またはレポート。

は、ExecuteNonQuery

使用:我々は、単一のデータベースレコードについて話している - 更新、 挿入で、削除し、Idで取得します。

は、ExecuteScalar

使用しないでください:データベースクエリは、単一の値を返し、この値 はT-SQLのパラメータとして定義することができたとき。 ExecuteNonQueryの出力が の場合は常にこの場合に優先されます。 柔軟性があります。明日は2つの値があるため、 ExecuteNonQueryメソッドのシグネチャを変更する必要はありません。

使用: 変数のT-SQL型制限のため、データベースクエリが単一の値を返し、この値を出力パラメータとして に定義できない場合。

Reference

+0

OPは、SQL ServerではなくMySQLのための 'MySqlCommand'クラスを参照しています。 –

+2

恐ろしいアドバイス:「正確に1レコードを選択すると、出力パラメータでExecuteNonQueryを使用しますか?待機待ち。実際には、与えられた1つの結果行の各列の* n *出力パラメータを宣言することを提案していますか?メンテナンス開発者に残酷。 –

1

構造化のために、あなたが先に行く、その後ExecuteReaderを使用する必要があり、場合、単にその後(閉じる)のリーダーを処分することを忘れないでください。これはプログラムにはほとんど影響を与えませんが、.Netの部分に限られている可能性があります。ほとんどの場合、追加のクラスインスタンスのメモリ消費だけです。実際、一部のADO.NetプロバイダはExecuteReaderExecuteNonQueryの内部で使用しています。

ここで大きな問題は、挿入クエリの後にSELECT * FROM table部分です。データを読み取るためにリーダーを使用していないにもかかわらず、選択クエリを実行するためにより多くのリソースを消費します。ここでは、ExecuteReaderExecuteNonQueryのどちらを使用するかは問わず、MySQL側には違いはありません。(読者から読まない限り)

関連する問題