1. 程式人生 > >VB.net操作oracle資料庫

VB.net操作oracle資料庫

特鬱悶的一件事情,費時費力!記下來,為後來者鋪路。

首先,我用VS2010開發對oracle10g資料庫的操作,結果發現微軟自帶的System.Data.OracleClient已經有一些常用物件提示過時;網上說最好用oracle自帶的ODP.net操作。

我到oracle網站下載ODAC這個安裝包,還註冊了使用者名稱,200多M,而且下載特慢,下載後結果是除錯了很久都不行。

其次,問用oracle的同事,告訴我安裝了oracle客戶端後在安裝目錄下有ODP.net的DLL,直接引用那個就OK了;我在我的oracle客戶端安裝錄D:\oracle\product\10.2.0\db_1\BIN下真的還找到了 Oracle.DataAccess.dll。

最後,VS2010的vb.net工程中引用這個dll,編寫對遠端oracle資料庫的操作測試,通過!

寫這麼多隻是因為忒鬱悶!我喜歡開源mysql、sqlite;還沒有自己創業,給別人打工不自由啊,只能按照專案要求來。鬱悶!!!

'引入oracle本身提供的.net資料引擎


Imports System
Imports System.Collections.Generic
Imports System.Text
Imports System.Data
Imports System.Xml
Imports System.Collections
Imports Oracle.DataAccess
Imports Oracle.DataAccess.Server
Imports Oracle.DataAccess.Client
Imports Oracle.DataAccess.Types




'引入開源日誌類庫
Imports log4net
Public Class OracleDbOperations
    '定義日誌物件 OracleHelper.Logging
    'Private Shared Log As log4net.ILog = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType)
    Private Shared Log As log4net.ILog = log4net.LogManager.GetLogger("OracleHelper.Logging")
    '資料庫連線物件
    Dim Conn As OracleConnection = Nothing
    '事務處理物件
    Dim Trans As OracleTransaction = Nothing
    '資料庫連線字串
    Dim ConnectionStr As String = Nothing
    '建構函式
    Sub New(ByVal ConnStr As String)
        ConnectionStr = ConnStr
        Conn = New OracleConnection(ConnectionStr)
    End Sub
    ''' <summary>
    ''' 關閉資料庫連線
    ''' </summary>
    ''' <returns>布林值</returns>
    ''' <remarks>成功關閉返回true;否則返回false</remarks>
    Public Function ConnClose() As Boolean
        Try
            If Conn.State <> ConnectionState.Closed Then
                Conn.Close()
                Conn.Dispose()
                Conn = Nothing
                Log.Info("資料庫關閉連線成功!")
                Return True
            End If
        Catch ex As Exception
            '寫日誌
            Log.Error("資料庫關閉連線失敗!")
        End Try
        Return False
    End Function
    ''' <summary>
    ''' 開啟資料庫連線
    ''' </summary>
    ''' <returns>布林值</returns>
    ''' <remarks>成功關閉返回true;否則返回false</remarks>
    Public Function ConnOpen() As Boolean
        Try
            If Conn.State <> ConnectionState.Open Then
                Conn.Open()
                Log.Info("資料庫開啟連線成功!")
                Return True
            End If
        Catch ex As Exception
            '寫日誌
            Log.Error("資料庫開啟連線失敗!")
        End Try
        Return False
    End Function
    ''' <summary>
    ''' 執行SQL語句或者儲存過程(對於輸入輸出引數值為nothing的欄位進行特殊處理為DBNull.Value);此為查詢型別,不提供事務處理支援
    ''' </summary>
    ''' <param name="cmdType">執行型別</param>
    ''' <param name="cmdText">執行文字</param>
    ''' <param name="params">輸入輸出引數資訊</param>
    ''' <returns>返回影響的行數</returns>
    ''' <remarks></remarks>
    Public Function ExecuteNoneQuery(ByVal cmdType As CommandType, ByVal cmdText As String, ByVal params As OracleParameter()) As Integer
        Dim rows As Integer = 0
        Try
            If ConnOpen() Then
                Dim cmd As New OracleCommand
                cmd.Connection = Conn
                cmd.CommandType = cmdType
                cmd.CommandText = cmdText
                '有引數時
                If params IsNot Nothing AndAlso params.Length > 0 Then
                    For Each p As OracleParameter In params
                        '對NULL值的引數資料進行特殊處理(VB中對NULL賦值為Nohting)
                        If p.Direction = ParameterDirection.InputOutput AndAlso p.Value Is Nothing Then
                            p.Value = DBNull.Value
                        End If
                        cmd.Parameters.Add(p)
                    Next
                End If
                rows = cmd.ExecuteNonQuery()
                '清理資源
                cmd.Parameters.Clear()
                cmd.Dispose()
                cmd = Nothing
                '關閉連線
                ConnClose()
            Else
                '寫日誌
                Log.Error("資料庫開啟連線失敗!")
            End If
        Catch ex As Exception
            '寫日誌
            Log.Error("<" & cmdText & ">執行ExecuteNonQuery出現異常!")
        End Try
        Return rows
    End Function
    ''' <summary>
    ''' 執行SQL語句或者儲存過程(對於輸入輸出引數值為nothing的欄位進行特殊處理為DBNull.Value);此為增刪改,提供事務處理支援
    ''' </summary>
    ''' <param name="cmdType">執行型別</param>
    ''' <param name="cmdText">執行文字</param>
    ''' <param name="params">輸入輸出引數資訊</param>
    ''' <returns>返回影響的行數</returns>
    ''' <remarks></remarks>
    Public Function ExecuteNoneQueryTrans(ByVal cmdType As CommandType, ByVal cmdText As String, ByVal params As OracleParameter()) As Integer
        Dim rows As Integer = 0
        Try
            If ConnOpen() Then
                Trans = Conn.BeginTransaction
                Dim cmd As New OracleCommand
                cmd.Connection = Conn
                cmd.CommandType = cmdType
                cmd.CommandText = cmdText
                '有引數時
                If params IsNot Nothing AndAlso params.Length > 0 Then
                    For Each p As OracleParameter In params
                        '對NULL值的引數資料進行特殊處理(VB中對NULL賦值為Nohting)
                        If p.Direction = ParameterDirection.InputOutput AndAlso p.Value Is Nothing Then
                            p.Value = DBNull.Value
                        End If
                        cmd.Parameters.Add(p)
                    Next
                End If
                rows = cmd.ExecuteNonQuery()
                Trans.Commit()
                '清理資源
                Trans.Dispose()
                Trans = Nothing
                cmd.Parameters.Clear()
                cmd.Dispose()
                cmd = Nothing
                '關閉連線
                ConnClose()
            Else
                '寫日誌
                Log.Error("資料庫開啟連線失敗!")
            End If
        Catch ex As Exception
            '寫日誌
            Log.Error("<" & cmdText & ">執行ExecuteNonQuery出現異常!")
            If IsNothing(Trans) = False Then
                Trans.Rollback()
                Trans.Dispose()
                Trans = Nothing
            End If
        End Try
        Return rows
    End Function


    ''' <summary>
    ''' 返回記錄集
    ''' </summary>
    ''' <param name="DsTable">記錄集中表名</param>
    ''' <param name="cmdType">型別</param>
    ''' <param name="cmdText">文字</param>
    ''' <param name="params">輸入輸出引數</param>
    ''' <returns>返回dateset或者nothing</returns>
    ''' <remarks>必須首先判斷返回值是否是nothing</remarks>
    Public Function ExecuteDataSet(ByVal DsTable As String, ByVal cmdType As CommandType, ByVal cmdText As String, ByVal params As OracleParameter()) As DataSet
        Dim ds As DataSet = Nothing
        Try
            If ConnOpen() Then
                Dim cmd As New OracleCommand
                cmd.Connection = Conn
                cmd.CommandType = cmdType
                cmd.CommandText = cmdText
                '有引數時
                If params IsNot Nothing AndAlso params.Length > 0 Then
                    For Each p As OracleParameter In params
                        '對NULL值的引數資料進行特殊處理(VB中對NULL賦值為Nohting)
                        If p.Direction = ParameterDirection.InputOutput AndAlso p.Value Is Nothing Then
                            p.Value = DBNull.Value
                        End If
                        cmd.Parameters.Add(p)
                    Next
                End If
                Dim da As New OracleDataAdapter(cmd)
                ds = New DataSet
                da.Fill(ds, DsTable)
                '清理資源
                cmd.Parameters.Clear()
                cmd.Dispose()
                cmd = Nothing
                da.Dispose()
                da = Nothing
                '關閉連線
                ConnClose()
            Else
                '寫日誌
                Log.Error("資料庫開啟連線失敗!")
            End If
        Catch ex As Exception
            '寫日誌
            Log.Error("<" & cmdText & ">執行ExecuteDataSet出現異常!")
        End Try
        Return ds
    End Function
    ''' <summary>
    ''' 返回XmlReader
    ''' </summary>
    ''' <param name="cmdType">型別</param>
    ''' <param name="cmdText">文字</param>
    ''' <param name="params">輸入輸出引數</param>
    ''' <returns>返回 或者nothing</returns>
    ''' <remarks>注意:呼叫該方法後,一定要對XmlReader進行Close</remarks>
    Public Function ExecuteXmlReader(ByVal cmdType As CommandType, ByVal cmdText As String, ByVal params As OracleParameter()) As XmlReader
        Dim dr As XmlReader = Nothing
        Try
            If ConnOpen() Then
                Dim cmd As New OracleCommand
                cmd.Connection = Conn
                cmd.CommandType = cmdType
                cmd.CommandText = cmdText
                '有引數時
                If params IsNot Nothing AndAlso params.Length > 0 Then
                    For Each p As OracleParameter In params
                        '對NULL值的引數資料進行特殊處理(VB中對NULL賦值為Nohting)
                        If p.Direction = ParameterDirection.InputOutput AndAlso p.Value Is Nothing Then
                            p.Value = DBNull.Value
                        End If
                        cmd.Parameters.Add(p)
                    Next
                End If
                '執行
                dr = cmd.ExecuteXmlReader
                '清理資源
                cmd.Parameters.Clear()
                cmd.Dispose()
                cmd = Nothing
            Else
                '寫日誌
                Log.Error("資料庫開啟連線失敗!")
            End If
        Catch ex As Exception
            '寫日誌
            Log.Error("<" & cmdText & ">執行ExecuteXmlReader出現異常!")
        End Try
        Return dr
    End Function


    ''' <summary>
    ''' 執行SQL語句或者儲存過程(對於輸入輸出引數值為nothing的欄位進行特殊處理為DBNull.Value);此為查詢型別,不提供事務處理支援
    ''' </summary>
    ''' <param name="cmdType">執行型別</param>
    ''' <param name="cmdText">執行文字</param>
    ''' <param name="params">輸入輸出引數資訊</param>
    ''' <returns>返回一個object型別的結果</returns>
    ''' <remarks>對返回值進行ctype()型別裝換後使用</remarks>
    Public Function ExecuteScalar(ByVal cmdType As CommandType, ByVal cmdText As String, ByVal params As OracleParameter()) As Object
        Dim Result As Object = 0
        Try
            If ConnOpen() Then
                Dim cmd As New OracleCommand
                cmd.Connection = Conn
                cmd.CommandType = cmdType
                cmd.CommandText = cmdText
                '有引數時
                If params IsNot Nothing AndAlso params.Length > 0 Then
                    For Each p As OracleParameter In params
                        '對NULL值的引數資料進行特殊處理(VB中對NULL賦值為Nohting)
                        If p.Direction = ParameterDirection.InputOutput AndAlso p.Value Is Nothing Then
                            p.Value = DBNull.Value
                        End If
                        cmd.Parameters.Add(p)
                    Next
                End If
                Result = cmd.ExecuteScalar()
                '清理資源
                cmd.Parameters.Clear()
                cmd.Dispose()
                cmd = Nothing
                '關閉連線
                ConnClose()
            Else
                '寫日誌
                Log.Error("資料庫開啟連線失敗!")
            End If
        Catch ex As Exception
            '寫日誌
            Log.Error("<" & cmdText & ">執行ExecuteScalar出現異常!")
        End Try
        Return Result
    End Function


    ''' <summary>
    ''' 返回datareader
    ''' </summary>
    ''' <param name="cmdType">型別</param>
    ''' <param name="cmdText">文字</param>
    ''' <param name="params">輸入輸出引數</param>
    ''' <returns>返回 或者nothing</returns>
    ''' <remarks>注意:呼叫該方法後,一定要對OracleDataReader進行Close</remarks>
    Public Function ExecuteDataReader(ByVal cmdType As CommandType, ByVal cmdText As String, ByVal params As OracleParameter()) As OracleDataReader
        Dim dr As OracleDataReader = Nothing
        Try
            If ConnOpen() Then
                Dim cmd As New OracleCommand
                cmd.Connection = Conn
                cmd.CommandType = cmdType
                cmd.CommandText = cmdText
                '有引數時
                If params IsNot Nothing AndAlso params.Length > 0 Then
                    For Each p As OracleParameter In params
                        '對NULL值的引數資料進行特殊處理(VB中對NULL賦值為Nohting)
                        If p.Direction = ParameterDirection.InputOutput AndAlso p.Value Is Nothing Then
                            p.Value = DBNull.Value
                        End If
                        cmd.Parameters.Add(p)
                    Next
                End If
                '執行
                dr = cmd.ExecuteReader(CommandBehavior.CloseConnection)
                '清理資源
                cmd.Parameters.Clear()
                cmd.Dispose()
                cmd = Nothing
            Else
                '寫日誌
                Log.Error("資料庫開啟連線失敗!")
            End If
        Catch ex As Exception
            '寫日誌
            Log.Error("<" & cmdText & ">執行ExecuteDataReader出現異常!")
        End Try
        Return dr
    End Function






End Class