2017-09-26 8 views
-1

複数のクエリを実行する場合、CommandsDataReadersを使用する場合のベストプラクティスは何ですか? 1つだけを作成し、それを処分するか閉じる前に、再度使用するか、毎回新しいものを作成して処分するか閉じることをお勧めしますか?たとえば...例については申し訳ありません複数のクエリを実行するときのベストプラクティス

Dim sqlcmd as SqlCommand 
Dim sqldr as SqlDatareader 

sqlcmd = new SqlCommand(Query here, connection) 
sqldr = sqlcmd.ExecuteReader 
'Do stuff 
sqlcmd.Dispose() 
sqldr.Close() 

sqlcmd = new SqlCommand(Different Query here, connection) 
sqlcmd.ExecuteNonQuery 
'Do stuff 
sqlcmd.Dispose() 

'And so on 

それとも

Dim sqlcmd as SqlCommand = new SqlCommand(Query here, connection) 
Dim sqldr as SqlDataReader = sqlcmd.ExecuteReader 
'Do stuff 
sqlcmd.Dispose() 
sqldr.Close() 

Dim anothersqlcmd as SqlCommand = new SqlCommand(Different Query here, connection) 
anothersqlcmd.ExecuteNonQuery 
'Do stuff 
anothersqlcmd.Dispose() 

'And so on 

は、私はusing文の承知しているが、私の例では、同じです。 1 CommandDataReaderを使用するか、毎回新しいものを作成する方が良いですか?

答えて

0

私は読みやすさのために、私はあなたの例では、異なるパラメータ

0

で新しいコマンドを持っている場合、それは問題ではない識別するために、オプション2となるだろう、関係なく、割り当てがあると思います。彼らはどちらも同じです。しかし、サンプル2では、sqlcmd.ExecuteNonQueryを呼び出すことでバグが発生します。

私は個人的に2つの別々のメソッドに置き、代わりにメソッドを呼び出します。接続オブジェクトが必要なときにのみ開いていることを確認し、不要なときにすぐに閉じるようにしてください。

+0

よろしくお願いします。貼り付けてコピーして、最初に入力したものを編集しました。 – crimson589

+0

接続について言えば、実行しようとするすべてのコマンドの接続を開いて閉じると、どのような問題が起きるでしょうか。 – crimson589

+0

@ crimson589コピー/ペーストすれば、コード内で同じことを行い、問題が発生する可能性があります。それを行うには、必要なときにのみ開閉してください。 –

0

これは私が行うことであり、必ずしもベストプラクティスではありませんが、接続を閉じてオブジェクトを処分することに非常に注意しています。

cn.Open() 
      If Mode = "Add" Then 
       cmd.CommandText = "InsertVendor" 
       RetVal = cmd.ExecuteNonQuery 
      Else 'Update 
       cmd.Parameters.Add("@ID", SqlDbType.Int).Value = itgID 
       cmd.CommandText = "UpdateVendors" 
       RetVal = cmd.ExecuteNonQuery 
      End If 
      cn.Close() 
      cmd.Dispose() 

ここでは、1つのコマンドオブジェクトを使用しましたが、2つの異なる操作に合わせて調整しました。すべてをクリーンアップするには、Try..Catch..Finallyを使用します。

Finally 
      If Not IsNothing(cmd) Then 
       cmd.Dispose() 
      End If 
      If cn.State = ConnectionState.Open Then 
       cn.Close() 
      End If 
     End Try 

次に、そこに私のオブジェクトの状態をチェックします。 Finallyブロックには例外がありません。 DataAccessクラス全体で同じ接続オブジェクトを使用します。 DataReaderに注意してください。作業が終了するまで接続を閉じないでください。

関連する問題