Search code examples
sqlvb.netms-accessdatagridviewdapper

How Multiple Query in datagridview using Dapper with database MS-ACCESS in VB.NET


I have three MS-Access files with different paths. How can I query multiple with dapper from list/model to datagridview.

Please Guide Me.

Thanks

Info path from MS-ACCESS files

TABLEA = D:\TABLEA.accdb
TABLEB = Z:\DATA\Malfin 07\TABLEB.accdb
TABLEC = Z:\DATA\Malfin D2\TABLEC.accdb
Public Class Form1
    Public Function GetOledbConnectionString() As String
        Return "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=;Persist Security Info=False;"
    End Function
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Using conn = New OleDbConnection(GetOledbConnectionString)
            Using data = conn.QueryMultiple("select * from User", Nothing)
            End Using
        End Using

    End Sub
End Class
Public Class User
    Public Property ID() As Integer
    Public Property FIRSTNAME() As String
    Public Property LASTNAME() As String
End Class

TABLEA

Table Name : User

ID FIRSTNAME LASTNAME
1 TEST1000 1000TEST
2 TEST2000 2000TEST

TABLEB

Table Name : User

ID FIRSTNAME LASTNAME
1 TEST3000 3000TEST
2 TEST4000 4000TEST

TABLEC

Table Name : User

ID FIRSTNAME LASTNAME
1 TEST5000 5000TEST
2 TEST6000 6000TEST

Desired Result in datagridview

FIRSTNAME LASTNAME
TEST1000 1000TEST
TEST2000 2000TEST
TEST3000 3000TEST
TEST4000 4000TEST
TEST5000 5000TEST
TEST6000 6000TEST

Solution

  • I don't think QueryMultiple works in this way.

    Either create three results set and UNION or Concat them:

    CONST constrA = "..."
    CONST constrB = "..."
    CONST constrC = "..."
    
    FUNCTION GetUsers(constr AS STRING) AS IENUMERABLE(OF User)
        USING con AS oledbconnection = NEW oledbconnection(constr)
            RETURN con.query(OF User)("SELECT * FROM [User]")
        END USING
    END FUNCTION
    
    SUB FORM_LOAD
        users_datagridview.datasource = GetUsers(constrA).UNION(GetUsers(constrB)).UNION(GetUsers(constrC)).TOLIST
    END SUB
    

    or add tables from B and C database to the A database as a linked-table so you can union them in a single query:

    CONST constrA = "..."
    
    FUNCTION GetAllUsers() AS IENUMERABLE(OF User)
        USING con As oledbconnection = NEW oledbconnection(constrA)
            RETURN con.query(OF User)("(SELECT * FROM [User]) UNION (SELECT * FROM User_B) UNION (SELECT * FROM User_C)")
        END USING
    END FUNCTION
    
    SUB FORM_LOAD
        users_datagridview.datasource = GetAllUsers.TOLIST
    END SUB