将字符串与数据库中的字符串进行比较将返回false

时间:2019-11-28 09:51:06

标签: c# sql mysql-workbench

我想在我的数据库中找到哪一行的“路径”字段的值等于字符串"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 +行的使用,它开始消耗资源

2 个答案:

答案 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的提示正确构建我的请求。

谢谢大家的帮助!