一定有一些非常明显的答案,但我就是看不到它,也无法从网络上找到解决方案。
我尝试从数据库表中计算有多少行包含文件路径,例如"路径"。
在访问设置表中,我有包含字符串的路径字段(短文本类型)的行:
\serverdirsomething
我想计算字段以"\服务器\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 '*\serverdir*'";
-> return count(*) = 0
这在MS Access 2013中有效,给出有效结果:
SELECT COUNT(*) FROM Settings WHERE path LIKE '*\serverdir*'
->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 '*serverdir*'
使用 c# 代码时,使用 OleDB 与 Access 数据库进行交互。 OleDb 需要 ANSI 通配符:%
和 _
而不是 *
和 ?
。
因此,由于上述查询在 Access 中有效,因此此查询应该从 c# 开始工作:
SELECT COUNT(*) FROM [table] WHERE path LIKE '%serverdir%'
使用 OleDb 运行的查询似乎也更容易受到保留字问题的影响。 所以我把表格括在方括号里,以免麻烦。
如果希望查询在 Access 内部或外部始终使用相同的工作方式,请使用 ALike
而不是 Like
。 ALike
向数据库引擎发出需要 ANSI 通配符的信号:
SELECT COUNT(*) FROM [table] WHERE path ALIKE '%serverdir%'
所以 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 '%\serverdir%'";
-> 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;
}
}
}