Accéder à une base de données oracle sans odbc ni mdac

Description

Cette classe permet de se connecter à un serveur Oracle 8i/9i et d'y exécuter des requêtes (Actions ou avec resultset).

Pour ça, j'ai utilisé la référence system.Data.OracleClient qui fonctionne super bien.

Je l'ai testée avec un Serveur Oracle 8.17 et les temps de réponse sont exeptionnels.

Source / Exemple :


Public Class OracleAccess

#Region "Sous Classes"

    Public Class ORAError

#Region "Variables"
        Dim Nbr As Integer
        Dim Desc As String
        Dim Src As String
#End Region

#Region "Propriétés"
        Public Property Number() As Integer
            Get
                Return Nbr
            End Get
            Set(ByVal Value As Integer)
                Nbr = Value
            End Set
        End Property

        Public Property Description() As String
            Get
                Return Desc
            End Get
            Set(ByVal Value As String)
                Desc = Value
            End Set
        End Property

        Public Property Source() As String
            Get
                Return Src
            End Get
            Set(ByVal Value As String)
                Src = Value
            End Set
        End Property
#End Region

    End Class

#End Region

#Region "Déclarations Locales"

    Dim ORAConn As System.Data.OracleClient.OracleConnection
    Dim ORACommand As OracleClient.OracleCommand
    Dim ORAReader As OracleClient.OracleDataReader
    Dim ORAServer As String
    Dim ORAUser As String
    Dim ORAPasswd As String
    Dim libSQL As String

#End Region

#Region "Propriétés de Classe"

    Public LastError As ORAError

    Public Property Serveur() As String
        Get
            Return ORAServer
        End Get
        Set(ByVal Value As String)
            ORAServer = Value
        End Set
    End Property

    Public Property Utilisateur() As String
        Get
            Return ORAUser
        End Get
        Set(ByVal Value As String)
            ORAUser = Value
        End Set
    End Property

    Public Property MotDePasse() As String
        Get
            Return ORAPasswd
        End Get
        Set(ByVal Value As String)
            ORAPasswd = Value
        End Set
    End Property

    Public Property Connected() As Boolean
        Get
            Return (ORAConn.State = ConnectionState.Open)
        End Get
        Set(ByVal Value As Boolean)
            If Value = True Then
                Open()
            Else
                Close()
            End If
        End Set
    End Property

    Public Property SQL() As String
        Get
            Return libSQL
        End Get
        Set(ByVal Value As String)
            libSQL = Value
        End Set
    End Property

#End Region

#Region "Fonctions Publiques"

    Public Sub New()
        'Initialisation des variables
        ORAConn = New OracleClient.OracleConnection
        ORACommand = New OracleClient.OracleCommand
        ORAServer = ""
        ORAUser = ""
        ORAPasswd = ""
    End Sub

    Public Overloads Function Open(ByVal Serveur As String, ByVal Utilisateur As String, ByVal MotDePasse As String) As String
        'Connexion à la base de données
        'Sur erreur, partir à l'onglet "ErrOpen"
        On Error GoTo ErrOpen
        'Définition et initialisation de strCn
        Dim strCn As String
        strCn = ""
        'Regarde si le paramètre Serveur n'est pas vide
        If Serveur <> "" Then
            'S'il existe, on défini les variables avec les paramètres
            ORAServer = Serveur
            ORAUser = Utilisateur
            ORAPasswd = MotDePasse
            'On défini la chaine de connexion
            strCn &= "Data Source=" & Serveur & ";"
            If Utilisateur <> "" Then strCn &= "User Id=" & Utilisateur & ";"
            If MotDePasse <> "" Then strCn &= "Password=" & MotDePasse & ";"
            ORAConn.ConnectionString = strCn
            'Et on se connecte à la base de données
            ORAConn.Open()
            'Renvoie la valeur Booléenne Vrai
            Return True
        Else
            Return False
        End If
ErrOpen:
        'En cas d'erreur, on défini l'historiquie d'erreur et on renvoie false
        LastError.Number = Err.Number
        LastError.Description = Err.Description
        LastError.Source = Err.Source
        Return False
    End Function

    Public Overloads Function open(ByVal serveur As String) As Boolean
        'Fonction sans les paramètres utilisateur, on va les chercher 
        'dans les propriétés de la classe
        Return open(serveur, ORAUser, ORAPasswd)
    End Function

    Public Overloads Function Open() As Boolean
        'Fonction sans les paramètres serveur, on va les chercher 
        'dans les propriétés de la classe
        Return Open(ORAServer, ORAUser, ORAPasswd)
    End Function

    Public Function Close() As Boolean
        'Fermeture de la connexion
        On Error GoTo ErrClose
        ORAConn.Close()
        Return True
ErrClose:
        LastError.Number = Err.Number
        LastError.Description = Err.Description
        LastError.Source = Err.Source
        Return False
    End Function

    Public Overloads Function ExecuteQuery(ByVal reqSQL As String, ByVal ResultTable As DataTable) As Boolean
        'Execution de requête SQL avec Retour vers un DataTable
        On Error GoTo ErrRecupData
        Dim ORADataAdapt As New OracleClient.OracleDataAdapter(reqSQL, ORAConn)
        ORADataAdapt.Fill(ResultTable)
        Return True
ErrRecupData:
        'En cas d'erreur, on quitte la fonction en retournant False
        LastError.Number = Err.Number
        LastError.Description = Err.Description
        LastError.Source = Err.Source
        Return False
    End Function

    Public Overloads Function ExecuteQuery(ByVal reqSQL As String, ByVal ResultSet(,) As String) As Boolean
        'Adaptation pour remplir dans un tableau string(,)
        On Error GoTo ErrRecupData
        Dim Table As DataTable
        Dim i, j As Integer
        'Exécution de la fonction version DataTable
        If ExecuteQuery(reqSQL, Table) Then 'Si la fonction renvoie True
            'Redimentionnement du tableau string(,) pour s'adapter au contenu de la
            'DataTable
            ReDim ResultSet(Table.Columns.Count, Table.Rows.Count)
            'Rempli le tableau string(,)
            For i = 0 To (Table.Columns.Count - 1)
                For j = 0 To (Table.Rows.Count - 1)
                    ResultSet(i, j) = CStr(Table.Rows(j).Item(i))
                Next
            Next
            'Renvoie True
            Return True
        Else
            Return False
        End If
ErrRecupData:
        LastError.Number = Err.Number
        LastError.Description = Err.Description
        LastError.Source = Err.Source
        Return False
    End Function

    Public Overloads Function ExecuteQuery(ByVal ResultTable As DataTable) As Boolean
        Return ExecuteQuery(libSQL, ResultTable)
    End Function

    Public Overloads Function ExecuteQuery(ByVal ResultSet(,) As String) As Boolean
        Return ExecuteQuery(libSQL, ResultSet)
    End Function

    Public Overloads Function ExecuteQuery() As DataTable
        Dim Table As New DataTable
        ExecuteQuery(libSQL, Table)
        Return Table
    End Function

    Public Overloads Function ExecuteNonQuery(ByVal reqSQL As String) As Integer
        On Error GoTo ErrExecuteSQL
        Dim i As Integer
        'Initialisation de la commande
        ORACommand.CommandText = reqSQL
        ORACommand.CommandType = CommandType.Text
        ORACommand.Connection = ORAConn
        'Exécution
        i = ORACommand.ExecuteNonQuery()
        Return i
ErrExecuteSQL:
        Return -1
    End Function

#End Region

End Class

Conclusion :


Je n'ai fait que lancer des requêtes SQL de type Texte dans mes commandes Oracle car je n'avais besoin que de ça.

Cependant, vous pourrez aussi accéder directement à une table ou à une procédure stockée. Pour cela, il suffit de changer le CommandType.

Bon courage @ tous

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.