我想在我的数据库中找到哪一行的“路径”字段的值等于字符串"c:\something\somethingelse\anotherthing.thing"
。
在提出SQL
请求之前,我通过浏览并复制了内容找到了这一行:
在C#
端,我的代码如下:
编辑:由于@CompuChip的评论,我对行进行了编辑,希望可以做得更好
String MyPath = "c:\\something\\somethingelse\\anotherthing.thing"
MyPath = String.Format("select * from x where path = '{0}'", MyPath);
然后我调用了创建请求并将其发送到我的数据库的方法,但是我遇到了异常
我在数据库上尝试了请求本身,但是即使我复制了确切的值也找不到行: 这是我尝试过的:
Select * from x where path = "c:\something\somethingelse\anotherthing.thing"
Select * from x where STRCMP(path, "c:\something\somethingelse\anotherthing.thing") = 0
有没有一种很好的方法可以正确比较字符串并找到我的行?
谢谢您的度过,并度过愉快的一天。
编辑2:
我也尝试使用C#获取所有行,然后将它们逐一进行比较。
它有效,但是随着10K +行的使用,它开始消耗资源
答案 0 :(得分:3)
请,请请不要这样构造您的SQL查询。
正确的解决方案是使用参数,如下所述: Why do we always prefer using parameters in SQL statements?
您的C#代码将变成这样(改编自链接的答案):
string sql = "select * from x where path = @path";
using (SqlCommand command = new SqlCommand(sql, connection))
{
var pathParam = new SqlParameter("path", SqlDbType.VarChar);
pathParam.Value = @"c:\something\somethingelse\anotherthing.thing";
command.Parameters.Add(pathParam);
var results = command.ExecuteReader();
}
或者,对于MySql,
string sql = "select * from x where path = ?path";
using (MySqlCommand command = new MySqlCommand(sql, connection))
{
var pathParam = new MySqlParameter("path",
@"c:\something\somethingelse\anotherthing.thing");
command.Parameters.Add(pathParam);
var results = command.ExecuteReader();
}
假设您(已检查您)实际上在数据库中具有匹配的记录,则问题可能出在引号或值的转义上。 如果确实如此,那么使用参数检索记录不仅是安全的事情,而且还将使引号或转义问题不成问题。
答案 1 :(得分:1)
看来我必须做与C#相同的事情,甚至在MySQL中也要在路径中放置两个反斜杠而不是一个反斜杠
此外,我还必须按照@CompuChip的提示正确构建我的请求。
谢谢大家的帮助!