【问题标题】:c# parameterized query returns no data/ null valuesc#参数化查询不返回数据/空值
【发布时间】:2019-01-17 10:12:27
【问题描述】:

使用 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();

但是,将值连接起来是可行的:

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());

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

我相信它必须与我正在传递的东西有关(带有 \'s 的路径会导致各种奇怪),但我无法确切地看到它是什么。对于正常工作的路径,我有许多其他参数化查询,但这两个不起作用。以前有人见过这样的东西

【问题讨论】:

  • 您不需要在参数周围加上单引号。
  • 对于第一个查询 - 我不相信您可以在 LIKE 子句中使用参数,至少不能这样。参考这个答案:stackoverflow.com/a/8537547/8061994 了解您如何做到这一点。
  • 我尝试使用 Concat 没有成功,不过感谢您的提醒

标签: c# mysql .net


【解决方案1】:

因为您的参数在查询的引用部分中,所以它不会被视为参数,而是被视为您正在搜索的文字字符串。你需要像这样连接它...

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 来查找包含您的参数的值,而该值似乎是根路径。如果该值将以该值开头,请删除初始通配符。

【讨论】:

  • 两个答案都返回 null :(
  • 您能否澄清一下您所说的 "returned null" 是什么意思,因为第一个查询是 DataReader,而第二个查询被放入不可为空的 int 中。其次,您能否确认Replace 没有干扰您的预期行为。
  • 感谢您的信息,我会考虑重构我的代码
猜你喜欢
  • 1970-01-01
  • 2016-04-02
  • 2020-03-18
  • 2022-08-09
  • 1970-01-01
  • 2020-07-12
  • 1970-01-01
  • 2016-07-09
  • 2013-12-24
相关资源
最近更新 更多