Bonjour,

Je fais des tests depuis quelque temps afin de pouvoir parvenir à lancer des requêtes à une base de données Postgresql (via ODBC) à l'aide de threads.

Mon application comporte une classe GestionBD.vb comportant toutes les fonctions relatives à ma base de données.

Une connection est constamment ouverte sur ma base de données.

Je désire donc, à partir de différentes forms, pouvoir obtenir un DataTable, un Reader ou encore un ArrayList comportant les résultats d'une requête sql.

GestionBD.vb
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
 
Public Class GestionBD
    Private connODBC As Odbc.OdbcConnection
    Private reader As Odbc.OdbcDataReader
    Private cmd As Odbc.OdbcCommand
    Private strConn As String
    Private strDataBaseName As String
    Private req As String
    Private arrayList As ArrayList = New ArrayList
    Private nbResultats As Integer = 0
 
    Public Sub New()
        connODBC = New Odbc.OdbcConnection()
    End Sub
 
    Public Sub ouvrirConn(ByVal mandat As String)
        strDataBaseName = mandat
        strConn = "Driver={PostgreSQL UNICODE};Server=192.168.0.14;Port=5432;Database=" & strDataBaseName & ";Uid=user;"
        Try
            With connODBC
                .Close()
                .ConnectionString = strConn
                .Open()
            End With
        Catch ex As Exception
            MsgBox(ex.ToString, MsgBoxStyle.Critical, "Mandat inexistant")
        End Try
 
    End Sub
 
    Public Sub execRequest(ByVal req as String)
        Console.Write(req)
        cmd = New Odbc.OdbcCommand(req, connODBC)
        reader = cmd.ExecuteReader()
        nbResultats = reader.FieldCount
    End Sub
 
    Public Sub fillArrayList()
        While reader.Read
            For i As Integer = 0 To nbResultats - 1
                arrayList.Add(reader.Item(i))
            Next
        End While
    End Sub
 
    Public ReadOnly Property prop_ArrayList() As ArrayList
        Get
            Return arrayList
        End Get
    End Property
frmMain.vb
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
Private Sub ToolStripMenuItem3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles itemOuvrirMandat.Click
        frm_Mandat.Show()
        gestionBD.ouvrirConn("MANDATS")
C'est donc suite à ce bout de code que je désire lancer ma requête:

Dans un thread:
gestionBD.execRequest("select * ...)
gestionBD.fillArrayList()
Dim arrayList as ArrayList = gestionBD.prop_ArrayList()

Quelle solution semble la plus simple? Quelle est la meilleure façon de travailler avec les threads et les bases de données?


Merci d'avance,

Arnaud