2009-08-13 6 views
0

Ich habe derzeit eine DataAccess Layer in Vb.Net. Ich bin nicht sehr glücklich mit meiner Implementierung meiner ExecuteQuery (als DataSet) und ExecuteNonQuery Funktionen. Hat jemand Code, den ich sehen könnte? Mein Code sieht einfach nicht sauber aus. Irgendwelche Gedanken oder Kritiken darüber würden auch geschätzt werden.ODP.NET Code Beispiel Crite oder Best Practices

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 

Antwort

0

Ein paar Dinge

  • Ich würde auf jeden Fall den Befehl Erstellungscode auf seine eigene Methode ausrücken. Sie verwenden es wahrscheinlich trotzdem wieder, also vermeiden Sie die Kopie & einfügen.
  • Sie sollten nicht verwenden um den Befehl verwenden, wie Sie es sowieso für die gesamte Verbindung verwenden. (kein Schaden dabei)
  • Eine einzige Abfrage Transaktion? Was nützt das?
  • Sie öffnen die Verbindung zweimal.

Hier ist ein Code, den ich verwende.

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 

Die wichtigsten Dinge im obigen Code

  • ich die Schaffung des Befehls zu einer Create Methode ausgebrochen habe.
  • Da ich Transaktionen auf Instanzenebene implementiere, muss das Verbindungsobjekt auch auf Instanzenebene sein, also kann ich nicht verwenden, sondern muss stattdessen versuchen - um sicherzustellen, dass die Verbindung geschlossen wird (wenn keine Transaktion ausgeführt wird).
  • Bei Transaktionen implementiere ich IDisposable und führe eine offene Verbindung während der gesamten Transaktion. Eine Alternative zur manuellen Implementierung von Transaktionen wäre die Verwendung des Namespaces System.Transactions, je nachdem, auf welche Datenbank Sie abzielen, welche Unterstützung sie hat und welche Transaktionssteuerung Sie benötigen.

Wie auch immer, das obige macht es einfach, sowohl mit als auch ohne Transaktionen zu arbeiten. Eine einfache Transaktion von oben würde wie folgt aussehen:

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

Und wenn keine Transaktionen benötigt werden, kann ich einfach tun

dim dt as DataTable = new MySqlWrapper().sql.QueryDataTable(a,b)