OleDb连接到MS Access:带有转义字符和通配符的类似SQL查询的子句
本文关键字:通配符 SQL 子句 查询 转义字符 MS 连接 Access OleDb | 更新日期: 2023-09-27 17:55:36
一定有一些非常明显的答案,但我就是看不到它,也无法从网络上找到解决方案。
我尝试从数据库表中计算有多少行包含文件路径,例如"路径"。
在访问设置表中,我有包含字符串的路径字段(短文本类型)的行:
''server'dir'something'
我想计算字段以"''服务器''dir.."开头的行。
在使用MS Access失败后,我开始使用mariaDB和heidiSQL进行测试,并在获得此查询的有效答案之前进行了一些试验和错误:
SELECT COUNT(*) FROM `Settings` WHERE `path` LIKE "%''''''''server''''dir''''%"
-> returns Count(*) = 3
在 C# 中,我得到与此相同的返回(通过反复试验再次找到):
string query = @"SELECT COUNT(*) FROM Settings WHERE path LIKE '%''''''''server''''dir''''%'";
var Test = MySqlHelper.ExecuteScalar(connString, query);
-> returns Count(*) = 3
现在我无法使用 OleDb 库使用 C# 和 Access 获得相同的工作:
string query = @"SELECT COUNT(*) FROM Settings WHERE path LIKE '*''''''''server''''dir''''*'";
OleDbConnection connection = new OleDbConnection(databsefile);
OleDbCommand command = new OleDbCommand(query, connection);
connection.Open();
var Test = command.ExecuteScalar();
-> returns Count(*) = 0
我还尝试了查询(使用 C# 和使用 OleDb 库访问):
string query = @"SELECT COUNT(*) FROM Settings WHERE path LIKE '*''''server''dir''*'";
-> return count(*) = 0
string query = @"SELECT COUNT(*) FROM Settings WHERE path LIKE '*''server'dir'*'";
-> return count(*) = 0
这在MS Access 2013中有效,给出有效结果:
SELECT COUNT(*) FROM Settings WHERE path LIKE '*''server'dir'*'
->returns Count(*) = 3
编辑:更改了数据库表名称表->设置
在字符串前使用 @ 时,无需再次转义反斜杠。LIKE 的占位符是 %,而不是 *。
所以试试:
string query = @"SELECT COUNT(*) FROM table WHERE path LIKE '%''''server''dir''%'";
为了避免所有这些转义,请考虑使用 SQL 参数。
PS:表是一个保留关键字。您不应该命名表表,这始终会导致问题。
您报告此查询在 Access 中正常工作:
SELECT COUNT(*) FROM table WHERE path LIKE '*'server'dir*'
使用 c# 代码时,使用 OleDB 与 Access 数据库进行交互。 OleDb 需要 ANSI 通配符:%
和 _
而不是 *
和 ?
。
因此,由于上述查询在 Access 中有效,因此此查询应该从 c# 开始工作:
SELECT COUNT(*) FROM [table] WHERE path LIKE '%'server'dir%'
使用 OleDb 运行的查询似乎也更容易受到保留字问题的影响。 所以我把表格括在方括号里,以免麻烦。
如果希望查询在 Access 内部或外部始终使用相同的工作方式,请使用 ALike
而不是 Like
。 ALike
向数据库引擎发出需要 ANSI 通配符的信号:
SELECT COUNT(*) FROM [table] WHERE path ALIKE '%'server'dir%'
所以 Mss Access 使用 * 作为通配符,就像T_D指示的那样,这是我的有效查询在 MS Access 中使用的。但就像HansUp指出的C# OleDb API仍然使用ANSI通配符一样。
但是,即使是对这个答案的小更正也是在 c# 中转义查询。因此,返回有效答案的查询是:
string query = "SELECT COUNT(*) FROM Settings WHERE path LIKE '%''''server''dir''%'";
OR
string query = @"SELECT COUNT(*) FROM Settings WHERE path LIKE '%''server'dir'%'";
-> returns Count(*) = 3
HansUp还指出,使用ALIKE而不是LIKE %也适用于MS Access,因此查询方式与ANSI通配符%兼容
。所以这是我的工作解决方案(带有命令参数):
string destFolder = @"''server''dir'";
string query = "SELECT COUNT(*) FROM Settings WHERE path LIKE @destFolder;";
using (OleDbConnection connection = new OleDbConnection(mdbfile))
{
using (OleDbCommand command = new OleDbCommand(query, connection))
{
command.Parameters.AddWithValue("@destFolder", "%" + destFolder + "%");
try
{
connection.Open();
if ((int)command.ExecuteScalar() == 3)
{
return true;
}
else
{
return false;
}
}
catch (OleDbException ex)
{
//handle OleDb error
return false;
}
}
}