c#参数化查询不返回数据/空值

时间:2018-08-09 20:53:38

标签: c# mysql .net

使用mysql,我试图使用参数化查询来获取/设置数据,但是其中一些返回null,尽管它们在不使用参数化查询的情况下也可以正常工作。这是我遇到的两个问题:

此数据库不返回任何数据:

// csvFolder looks ridiculous but this is actually way it needs to look like to work
string csvFolder = "C:\\\\\\\\Users\\\\\\\\fakename\\\\\\\\Desktop\\\\\\\\csvScanner\\\\\\\\testeappfolder"
MySqlCommand deleteCheck = new MySqlCommand("SELECT * FROM email_list WHERE filepath LIKE '%@csvfolder%' AND expired IS NULL", conn);
deleteCheck.Parameters.AddWithValue("@csvfolder", csvFolder);
MySqlDataReader deleteRdr = deleteCheck.ExecuteReader();

但是,将in的值串联起来将起作用:

MySqlCommand deleteCheck = new MySqlCommand("SELECT * FROM email_list WHERE filepath LIKE '%" + csvFolder + "%' AND expired IS NULL", conn);
MySqlDataReader deleteRdr = deleteCheck.ExecuteReader();

此代码从ExecuteScalar返回null。

MySqlCommand getId = new MySqlCommand("SELECT * FROM email_list WHERE filepath = '@filepath' ORDER BY expired DESC LIMIT 1", conn);
getId.Parameters.AddWithValue("@filepath", deletedPath.Replace(@"\", "\\\\"));
int id = int.Parse(getId.ExecuteScalar().ToString());

但是在连接时也可以正常工作。

我认为这一定与我传递的内容有关(带有\的路径会引起各种怪异),但是我无法确切地知道它是什么。我还有许多其他参数化的查询,这些查询可以正常工作,但是这两个不起作用。有人以前见过这样的东西

1 个答案:

答案 0 :(得分:0)

因为参数位于查询的带引号的部分内,所以不会将其视为参数,而是将其视为要搜索的文字字符串。您需要像这样将其串联起来...

MySqlCommand deleteCheck = new MySqlCommand(
    "SELECT * FROM email_list WHERE filepath LIKE '%'+@csvfolder+'%' AND expired IS NULL", conn);

ExecuteScalar示例类似:

MySqlCommand getId = new MySqlCommand(
    "SELECT * FROM email_list WHERE filepath = @filepath ORDER BY expired DESC LIMIT 1", conn);

其他提示:

  1. MySqlCommandMySqlDataReader均为IDisposable,因此每个都应放在using块中。
  2. 您可以使用文字字符串使该字符串更容易使用 string csvFolder = @"C:\\\\Users\\\\fakename\\\\Desktop\\\\csvScanner\\\\testeappfolder"(这看起来仍然不正确,但等效于您提供的值) 。
  3. 您可能想阅读can we stop using AddWithValue
  4. SELECT *ExecuteScalar(仅使用第一行的第一个值)将来有被破坏的风险:更安全地选择要使用的特定列。
  5. 您正在使用LIKE来查找一个值包含的参数,而该值似乎是根路径。如果该值将以该值开头,请删除初始通配符。