如何在 datagridview 中使用 Dapper 和数据库 MS-ACCESS 进行多重查询 VB.NET

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

提问人:roy 提问时间:7/26/2023 最后编辑:roy 更新时间:7/27/2023 访问量:76

问:

我有三个具有不同路径的MS-Access文件。如何使用 dapper 从列表/模型查询多个数据网格视图。

请指导我。

谢谢

MS-ACCESS 文件的信息路径

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的

表名:用户

编号 名字 姓氏
1 TEST1000 1000测试
2 TEST2000 2000测试

表B

表名:用户

编号 名字 姓氏
1 TEST3000 3000测试
2 TEST4000 4000测试

表C

表名:用户

编号 名字 姓氏
1 TEST5000 5000测试
2 TEST6000 6000测试

datagridview 中的预期结果

名字 姓氏
TEST1000 1000测试
TEST2000 2000测试
TEST3000 3000测试
TEST4000 4000测试
TEST5000 5000测试
TEST6000 6000测试
SQL vb.net MS-Access DataGridView dapper

评论

0赞 Palle Due 7/26/2023
您正在尝试同时查询三个 Access 数据库。我认为这是不可能的。
0赞 roy 7/27/2023
@PalleDue,你说不可能的原因是什么,但从下面的答案中它得到了我想要的输出。

答:

1赞 Shahram Alemzadeh 7/26/2023 #1

我不认为 QueryMultiple 以这种方式工作。

创建三个结果集和 UNION 或连接它们:

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

或者将 B 和 C 数据库中的表作为链接表添加到 A 数据库中,以便可以在单个查询中合并它们:

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

评论

0赞 roy 7/27/2023
谢谢你的回答。你的回答很完美。首先,我有一个错误,但我将表重命名为可能是因为Access中的保留字syntax error in from clauseUserUsers
0赞 Shahram Alemzadeh 7/27/2023
很高兴听到这个消息,并感谢您的友好回应。我编辑了代码并在 User 周围添加了 [ ]。
0赞 roy 7/27/2023
好的,谢谢先生
0赞 roy 7/27/2023
如果我对每个访问文件的每个 sql 进行访问,是否可以使用您的第一个答案选项
0赞 Shahram Alemzadeh 7/27/2023
@pret : 对不起,你的问题对我来说有点含糊不清。正如 Palle Due 已经提到的,dapper 查询一次只处理一个连接,因此只处理一个数据库。在第一种方法中,实际上将来自 3 个独立数据库的 3 个结果集合并为一个结果集。并且,每个数据库都使用单独的连接。