0

我目前在 Vb.Net 中有一个数据访问层。我对 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
4

1 回答 1

0

一些东西

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

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

 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)
于 2009-09-01T09:41:34.237 回答