Bonjour.

Je suis de la génération de développeur VB6 qui utilisait ADODB.connection pour se connecter aux base de données Oracle. Depuis que je suis rendu en VB.NET, je me suis fait dire que passer par ADODB n'était pas ce qui était de plus idéal, car ça utilisait entre autre COM alors que DbConnection était natif à .NET. Il valait peut-être mieux passer, par exemple, DbConnection. Or, j'ai fait deux petits tests afin de lire le nombre d'enregistrements d'une table Oracle.

En utilisant ADODB, ça prend environ 46 millisecondes alors que la même chose prend environ 937 millisecondes en passant par DbConnection. Selon plusieurs personnes, ça devrait être plus rapide par DbConnection. Notez qu'avec oracle direct (TOAD), ça prend 16 millisecondes (la référence)

Est-ce quelqu'un sait pourquoi c'est si lent avec DbConnection alors que ça ne devrait pas être la cas? Sinon, ça augure pas trop bien pour l'utilisation de cette nouvelle façon de faire?

Voici le code des boutons qui font les deux tests:
La class Form1.vb

Option Explicit On
Imports System.Data.OracleClient
Imports System.Data.Common
Imports System.Data.SqlClient

Public Class Form1
Dim TempsInitial As DateTime
Dim NomBD As String = "TGEO"
Dim Password As String = "ugeot05"
Dim User As String = "PWD"

Private Sub cmdADODB_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdADODB.Click
TempsInitial = DateTime.Now

Dim cnn As ADODB.Connection = Nothing
If cnn Is Nothing Then
cnn = Refaire_Connexion_Oracle(NomBD, User, Password)
End If

Dim rst As ADODB.Recordset = New ADODB.Recordset
rst.CursorLocation = ADODB.CursorLocationEnum.adUseClient
rst.Open("select * from voi_log_erreurgeobase", cnn, ADODB.CursorTypeEnum.adOpenDynamic, ADODB.LockTypeEnum.adLockOptimistic)

Dim ts As TimeSpan = DateTime.Now - TempsInitial
MsgBox(rst.RecordCount & vbNewLine & CInt(ts.Milliseconds)) 'montre 46 millisesondes

rst.Close()
rst = Nothing
cnn.Close()
cnn = Nothing

End Sub

Private Sub cmdDbConnection_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdDbConnection.Click
TempsInitial = DateTime.Now

Dim dbFactory As DbProviderFactory = DbProviderFactories.GetFactory("System.Data.OracleClient")
Dim dbConn As DbConnection = Nothing
dbConn = dbFactory.CreateConnection

Dim m_connectionString As String = String.Empty
m_connectionString = "Data Source=" & NomBD & ";" & _
"User Id=" & User & ";" & _
"Password=" & Password & ";" & _
"Integrated Security=no;"

dbConn.ConnectionString = m_connectionString
dbConn.Open()

Dim cmd As DbCommand = dbConn.CreateCommand()
cmd.CommandType = Data.CommandType.Text
cmd.CommandText = "select count(*) from voi_log_erreurgeobase"
cmd.Prepare()

Dim Counter As Integer = cmd.ExecuteScalar
Dim ts As TimeSpan = DateTime.Now - TempsInitial
MsgBox(Counter & vbNewLine & CInt(ts.Milliseconds)) 'montre 937 millisesondes

End Sub

Function Refaire_Connexion_Oracle(ByVal DataBase As String, ByVal User As String, ByVal PWD As String) As ADODB.Connection
Dim StringOracle As String
Dim cnn As ADODB.Connection
cnn = New ADODB.Connection
Try
StringOracle = "Provider=OraOLEDB.Oracle;Data source=" & DataBase & ";User ID=" & User & ";Password=" & PWD
cnn.Open(StringOracle)
Catch e As Exception
Try
StringOracle = "Provider=MSDAORA;Data source=" & DataBase & ";User ID=" & User & ";Password=" & PWD
cnn.Open(StringOracle)
Catch ex As Exception
Dim sErreur As String
sErreur = "ERREUR: Variable_Initialisation de MOD_Gloabal.vb: Une erreur fatale est survenue." & vbCrLf _
& "Source: " & ex.Source & vbCrLf & "Description: " & ex.Message & vbCrLf & " Numéro: " & Err.Number
MessageBox.Show(sErreur, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
Finally
Refaire_Connexion_Oracle = cnn
End Try
End Function

End Class