2009-08-13 21 views
0

現在、Vb.NetにはDataAccessレイヤがあります。私はExecuteQuery(DataSetとして)とExecuteNonQueryの両方の実装に満足していません。誰も私が見ることができるコードを持っていますか?私のコードはきれいに見えません。それについての考えや批評も高く評価されます。ODP.NETのコード例クリエイティブまたはベストプラクティス

Using odpConn As OracleConnection = New OracleConnection(_myConnString) 
       odpConn.Open() 
       If _beginTransaction Then 

        txn = odpConn.BeginTransaction(IsolationLevel.Serializable) 
       End If 
       Try 

        Using odpCmd As OracleCommand = odpConn.CreateCommand() 

         odpCmd.CommandType = CommandType.Text 
         odpCmd.CommandText = sSql 
         For i = 0 To parameters.Parameters.Count - 1 
          Dim prm As New OracleParameter 
          prm = DirectCast(parameters.Parameters(i), ICloneable).Clone 
          odpCmd.Parameters.Add(prm) 
         Next 

         If (odpConn.State = ConnectionState.Closed) Then 
          odpConn.Open() 
         End If 
         iToReturn = odpCmd.ExecuteNonQuery() 
         If _beginTransaction Then 
          txn.Commit() 
         End If 
        End Using 

       Catch 
        txn.Rollback() 
       End Try 

      End Using 

答えて

0

いくつ

  • 私は間違いなく、独自のメソッドにコマンド作成コードを移動します。とにかくそれを再使用している可能性がありますので、コピー&の貼り付けは避けてください。
  • とにかく接続全体で使用しているので、コマンドの前後で使用する必要はありません。 (そうすることで害はありません)
  • 1つのクエリトランザクション?その中での使用は何ですか?
  • 接続を2回開きます。

ここに私が使用しているコードがあります。

Public Function QueryDataTable(ByVal storedProcedureName As String, ByVal ParamArray parameters As IDbDataParameter()) As DataTable 
     Try 
      Dim command As SqlCommand = CreateCommand(connection, storedProcedureName, parameters) 
      Dim adapter As System.Data.SqlClient.SqlDataAdapter = New System.Data.SqlClient.SqlDataAdapter(command) 
      Dim dtResult As New DataTable() 

     If transaction Is Nothing Then connection.Open() 
     adapter.Fill(dtResult) 
     Return dtResult 
    Catch ex As Exception 
     Log.Append("SQL", "QueryDataTable", ex) 
     Throw 
    Finally 
     If transaction Is Nothing Then connection.Close() 
    End Try 
End Function 

私はCreateCommandメソッドにコマンドの作成を行う壊れている

  • 上記のコードで主なもの。
  • 私はインスタンスレベルでトランザクションを実装しているので、接続オブジェクトもインスタンスレベルになければならないため、使用することはできませんが、代わりに接続が閉じられるようにtry-finallyに進む必要がありますトランザクションが実行されていない場合)。
  • トランザクションの場合、私はIDisposableを実装し、トランザクション全体でオープンな接続を維持します。手動でトランザクションを実装する代わりに、ターゲットとするデータベース、サポートされているデータベース、必要なトランザクション制御のレベルに応じて、System.Transactions名前空間を使用することもできます。

とにかく、上記のようにトランザクションの有無にかかわらず簡単に作業することができます。上記からの単純なトランザクションは次のようになります。

Using sql = new MySqlWrapper(transactionLevel) 
    dim dt as DataTable = sql.QueryDataTable(a,b) 
    if EverythingOK(dt) then sql.CommitTransaction() 
End Using 

をしてもトランザクションが必要とされていない場合、私は単に

dim dt as DataTable = new MySqlWrapper().sql.QueryDataTable(a,b) 
を行うことができます
関連する問題