我正在使用包含表格和查询的现有Access 2010数据库(' views')。
当我从Visual Studio 2015连接数据库时,像Database Explorer这样的工具可以看到Access表的内容,但对于包含LIKE运算符的查询,可以看到' *'通配符,它只看到标题标题,没有记录。
我发现如果我在Visual Studio中复制那些基于访问的查询但是替换了LIKE' *'带有'%'的通配符,这些基于VS的查询有效(它们返回非零记录)。
这个特定的Access数据库充满了查询' *'并且很难将它们全部改变(例如,改为ALIKE)。
有没有办法让Visual Studio工具与' *'在该数据库中的LIKE查询?也许连接字符串上的参数或VS中的属性?或者也许有些东西可以在数据库本身中更改(全局参数)?
将VS中的提供程序从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
感谢任何想法。
答案 0 :(得分:1)
不,没有这样的设置。你必须采用这种或那种方式。
答案 1 :(得分: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查询,那么您可能不得不放弃构建在顶部的内置Visual Studio数据库工具System.Data.OleDb
(例如,数据源和TableAdapter)并使用ODBC。