如何让 Visual Studio 2015 使用 Access 2010 LIKE 通配符

Posted

技术标签:

【中文标题】如何让 Visual Studio 2015 使用 Access 2010 LIKE 通配符【英文标题】:How to get Visual Studio 2015 to work with Access 2010 LIKE wildcards 【发布时间】:2017-02-05 18:33:56 【问题描述】:

我正在使用包含表和查询(“视图”)的现有 Access 2010 数据库。

当我从 Visual Studio 2015 连接数据库时,数据库资源管理器之类的工具可以查看 Access 表的内容,但对于包含带有“*”通配符的 LIKE 运算符的查询,它只看到标题标题,记录为零.

我发现,如果我在 Visual Studio 中复制那些基于 Access 的查询,但将 LIKE '*' 通配符替换为 '%',这些基于 VS 的查询就可以工作(它们返回非零记录)。

这个特定的 Access 数据库充满了带有“*”的查询,并且很难将它们全部更改(例如,更改为 ALIKE)。

有没有办法让 Visual Studio 工具与该数据库中 LIKE 查询中的“*”一起工作?可能是连接字符串上的参数,还是 VS 中的属性?或者数据库本身有什么可以改变的(全局参数)?

将 VS 中的 Provider 从 Microsoft.ACE.OLEDB.4.0 更改为 Microsoft.ACE.OLEDB.12.0 没有效果。数据库显然是 04.00.0000(连接属性)。

我希望创建一个 C# 桌面应用程序,该应用程序可以访问该数据库(及其具有那些“*”通配符的查询)。

有关通配符不兼容的背景,请参阅例如LIKE query on an Access database via C# always returns COUNT(*) of 0

感谢您的任何想法。

【问题讨论】:

【参考方案1】:

Visual Studio 内置数据库工具倾向于使用System.Data.OleDb 进行数据库操作。您看到的是 Access OLEDB 提供程序的不幸限制。

对于名为 [fruits] 的 Access 表

id  fruit
--  -----
 1  apple
 2  banana
 3  cherry
 4  apricot

还有一个名为 [qry_aFruits] 的 Access 保存查询

SELECT fruit
FROM fruits
WHERE fruit LIKE "a*";

以下使用 System.Data.OleDb 的 C# 代码不返回任何行

myConnectionString =
        @"Provider=Microsoft.ACE.OLEDB.12.0;" +
        @"Data Source=C:\Users\Public\Database1.accdb;";
using (var conn = new OleDbConnection(myConnectionString))

    conn.Open();
    using (var cmd = new OleDbCommand("SELECT * FROM [qry_aFruits]", conn))
    
        using (OleDbDataReader rdr = cmd.ExecuteReader())
        
            while (rdr.Read())
            
                Console.WriteLine(rdr["fruit"]);
            
        
    

但是,使用 System.Data.Odbc 的相同代码返回两行,正如预期的那样:

myConnectionString =
        @"Driver=Microsoft Access Driver (*.mdb, *.accdb);" +
        @"Dbq=C:\Users\Public\Database1.accdb;";
using (var conn = new OdbcConnection(myConnectionString))

    conn.Open();
    using (var cmd = new OdbcCommand("SELECT * FROM [qry_aFruits]", conn))
    
        using (OdbcDataReader rdr = cmd.ExecuteReader())
        
            while (rdr.Read())
            
                Console.WriteLine(rdr["fruit"]);
            
        
    

因此,如果您需要处理大量使用 * 作为 LIKE 通配符的已保存 Access 查询,那么您可能不得不放弃基于 System.Data.OleDb 构建的内置 Visual Studio 数据库工具(例如,数据源和表适配器)并使用 ODBC。

【讨论】:

感谢您的详尽而有帮助的回复。 对于任何未来的读者:我的数据库有密码,所以我必须在上面提到的两个连接字符串中添加以下内容:'Jet OLEDB:Database Password=xxxx'(用于 OLEDB)和' PWD=xxxx'(用于 ODBC)。【参考方案2】:

不,没有这样的设置。您将不得不采取一种或另一种方式。

【讨论】:

感谢您提供的信息。我可能最终会将所有查询更改为 ALIKE(以便我可以使用 VS 工具和组件)。

以上是关于如何让 Visual Studio 2015 使用 Access 2010 LIKE 通配符的主要内容,如果未能解决你的问题,请参考以下文章

如何让 qGLWidget 在 Visual Studio 中显示

如何让 Visual Studio Code linter 忽略一行?

Visual Studio 2015 / Visual Assist 自动完成行为

如何在 Visual Studio 2015 中启用 WiX 项目

使用 Visual Studio 2015 运行啥模拟器 - 让 Xamarin 工作的社区版>

在 Visual Studio 2015 中使用 ADO.NET 和 MySQL