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

编辑:更改了数据库表名称表->设置

OleDb连接到MS Access:带有转义字符和通配符的类似SQL查询的子句

在字符串前使用 @ 时,无需再次转义反斜杠。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 而不是 LikeALike向数据库引擎发出需要 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;
        }
    }
}