【问题标题】:How to get Visual Studio 2015 to work with Access 2010 LIKE wildcards如何让 Visual Studio 2015 使用 Access 2010 LIKE 通配符
【发布时间】: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

感谢您的任何想法。

【问题讨论】:

    标签: c# visual-studio ms-access ms-access-2010 oledb


    【解决方案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 工具和组件)。
    猜你喜欢
    • 2020-01-21
    • 2017-06-03
    • 1970-01-01
    • 2021-05-14
    • 2017-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    相关资源
    最近更新 更多