如何让 Visual Studio 2015 使用 Access 2010 LIKE 通配符
How to get Visual Studio 2015 to work with Access 2010 LIKE wildcards
我正在使用包含表和查询 ('views') 的现有 Access 2010 数据库。
当我从 Visual Studio 2015 连接数据库时,数据库资源管理器等工具可以看到 Access 表的内容,但对于包含带有“*”通配符的 LIKE 运算符的查询,它只能看到 header 标题,零记录。
我发现,如果我在 Visual Studio 中复制那些 Access-based 查询,但将 LIKE '*' 通配符替换为 '%',那些 VS-based 查询会起作用(它们 return non-zero 条记录).
这个特定的 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
感谢任何想法。
不,没有这样的设置。您将不得不采取一种或另一种方式。
Visual Studio built-in 数据库工具倾向于使用 System.Data.OleDb
进行数据库操作。您看到的是 Access OLEDB 提供程序的不幸限制。
对于名为 [fruits]
的访问 table
id fruit
-- -----
1 apple
2 banana
3 cherry
4 apricot
和一个名为 [qry_aFruits]
的 Access 保存查询
SELECT fruit
FROM fruits
WHERE fruit LIKE "a*";
以下 C# 代码使用 System.Data.OleDb
returns 无行
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
returns 两行,正如预期的那样:
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 查询,那么您可能不得不放弃 built-in Visual Studio 数据库工具建立在 System.Data.OleDb
之上(例如数据源和 TableAdapter)并使用 ODBC。
我正在使用包含表和查询 ('views') 的现有 Access 2010 数据库。
当我从 Visual Studio 2015 连接数据库时,数据库资源管理器等工具可以看到 Access 表的内容,但对于包含带有“*”通配符的 LIKE 运算符的查询,它只能看到 header 标题,零记录。
我发现,如果我在 Visual Studio 中复制那些 Access-based 查询,但将 LIKE '*' 通配符替换为 '%',那些 VS-based 查询会起作用(它们 return non-zero 条记录).
这个特定的 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
感谢任何想法。
不,没有这样的设置。您将不得不采取一种或另一种方式。
Visual Studio built-in 数据库工具倾向于使用 System.Data.OleDb
进行数据库操作。您看到的是 Access OLEDB 提供程序的不幸限制。
对于名为 [fruits]
的访问 tableid fruit
-- -----
1 apple
2 banana
3 cherry
4 apricot
和一个名为 [qry_aFruits]
的 Access 保存查询SELECT fruit
FROM fruits
WHERE fruit LIKE "a*";
以下 C# 代码使用 System.Data.OleDb
returns 无行
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
returns 两行,正如预期的那样:
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 查询,那么您可能不得不放弃 built-in Visual Studio 数据库工具建立在 System.Data.OleDb
之上(例如数据源和 TableAdapter)并使用 ODBC。