VB.NET中使用Dapper操作MS-Access时文本框搜索失效问题排查
你的代码存在以下几个关键问题
- 参数添加逻辑错误:
DynamicParameters.Add的第一个参数应该是参数名称,而非完整的SQL条件语句。你当前把WHERE子句内容当成参数名传入,完全不符合Dapper的参数绑定规则。 - SQL语句未关联搜索条件:调用
Query方法时传入的是固定SQLSelect ContactID,Nme,Mobile,Address from contact,根本没用到你试图添加的搜索逻辑,自然不会产生筛选效果。 - Access通配符使用错误:MS Access的LIKE语法通配符是
*,而非SQL Server常用的%,用%无法在Access中实现模糊匹配。 - 条件逻辑构建错误:你想要的“空文本时查全部、有值时模糊匹配”逻辑,应该通过动态拼接SQL+绑定参数实现,而非把条件塞进参数里。
修正后的示例代码
Private Sub FillDataGridView() Dim searchText As String = txtSearch.Text.Trim() ' 动态构建SQL:空文本查全部,有值则添加模糊匹配条件 Dim sql As String = If(String.IsNullOrEmpty(searchText), "Select ContactID,Nme,Mobile,Address from contact", "Select ContactID,Nme,Mobile,Address from contact WHERE Nme LIKE @SearchText") Dim param As New DynamicParameters() ' 仅当搜索文本非空时绑定参数,使用Access兼容的通配符* If Not String.IsNullOrEmpty(searchText) Then param.Add("@SearchText", $"*{searchText}*") End If Dim list As List(Of Contact) = oledbCon.Query(Of Contact)(sql, param, commandType:=CommandType.Text).ToList() dgvContact.DataSource = list dgvContact.Columns(0).Visible = False End Sub Private Sub btnSearch_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnSearch.Click If Not Me.btnSearch.IsHandleCreated Then Return Try FillDataGridView() Catch ex As Exception MessageBox.Show(ex.Message) End Try End Sub
额外说明
- Dapper通过
@参数名关联SQL占位符与参数值,参数名称必须和SQL中的占位符完全一致。 - 如果需要跨数据库兼容通配符,可以根据数据库类型动态替换,但Access环境下固定使用
*即可。
内容的提问来源于stack exchange,提问作者roy
相关产品推荐
相关产品推荐

