2009-08-13 39 views
0

我目前在Vb.Net中有一個DataAccess Layer。我對我的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

有幾件事情

  • 我會definitly搬出命令生成代碼,以它自己的方法。無論如何,您可能正在重複使用它,因此請避免複製粘貼&。
  • 無論如何,您不應該在整個連接中使用該命令時使用該命令。 (雖然這樣做沒有傷害)
  • 一個查詢事務?那有什麼用?
  • 您打開連接兩次。

這是我使用的一些代碼。

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方法。
  • 由於我在實例級別上實現事務,所以連接對象也必須位於實例級別,所以我不能使用using,而必須使用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)