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

OleDbConnection to MS Access: SQL query like clause with escape characters and wildcards

一定有一些非常明显的答案,但我看不到它,也没有从网上找到解决方案。

我尝试从 db table 中计算有多少行包含文件路径 LIKE "path".

在 Access Settings-table 我有行,其中路径字段(短文本类型)包含字符串:

\server\dir\something\

我想计算字段以“\server\dir..”开头的行数。

在使用 MS Access 失败后,我开始使用 mariaDB 和 heidiSQL 进行测试,并进行了一些试验和错误,然后才获得此查询的有效答案:

SELECT COUNT(*) FROM `Settings` WHERE `path` LIKE "%\\\\server\\dir\\%"
-> returns Count(*) = 3

在 C# 中,我得到与此相同的 return(通过反复试验再次找到):

string query = @"SELECT COUNT(*) FROM Settings WHERE path LIKE '%\\\\server\\dir\\%'";
var Test = MySqlHelper.ExecuteScalar(connString, query);
-> returns Count(*) = 3

现在我无法使用 C# 和使用 OleDb 库的 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 库的 Access):

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

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

在字符串前使用@时,不需要再对反斜杠进行转义。 LIKE 的占位符是 %,而不是 *.

所以尝试:

string query = @"SELECT COUNT(*) FROM table WHERE path LIKE '%\\server\dir\%'";

为了避免所有转义,请考虑使用 SQL 参数。

PS:table是保留关键字。你不应该命名 table table,这总是会导致问题。

您报告此查询在 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 的查询 运行 似乎也更容易受到保留字问题的影响。所以我把table括在方括号里,以免麻烦。

如果您想要一个在 Access 内部或外部始终有效的查询,请使用 ALike 而不是 LikeALike 指示数据库引擎期待 ANSI 通配符:

SELECT COUNT(*) FROM [table] WHERE path ALIKE '%\server\dir%'

所以 Ms Access 使用 * 作为通配符,如 所示,这是我在 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;
        }
    }
}