ODP.NET代码示例Critque或最佳实践

时间:2009-08-13 12:06:17

标签: vb.net odp.net

我目前在Vb.Net中有一个DataAccess图层。我对我的ExecuteQuery(作为DataSet)和ExecuteNonQuery函数的实现都不太满意。有没有人有我能看到的代码?我的代码看起来不干净。任何想法或批评也会受到赞赏。

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

1 个答案:

答案 0 :(得分:0)

一些事情

  • 我肯定会将命令创建代码移出到自己的方法中。无论如何,你可能正在重复使用它,所以请避免使用副本和粘贴。
  • 无论如何,您都不需要在整个连接上使用它。 (虽然这样做没有害处)
  • 一次查询交易?有什么用?
  • 您打开连接两次。

以下是我正在使用的一些代码。

 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)