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
而不是 Like
。 ALike
指示数据库引擎期待 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;
}
}
}
一定有一些非常明显的答案,但我看不到它,也没有从网上找到解决方案。
我尝试从 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
而不是 Like
。 ALike
指示数据库引擎期待 ANSI 通配符:
SELECT COUNT(*) FROM [table] WHERE path ALIKE '%\server\dir%'
所以 Ms Access 使用 * 作为通配符,如
但即使是对该答案的小修正也将是在 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;
}
}
}