使用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());
但是在连接时也可以正常工作。
我认为这一定与我传递的内容有关(带有\的路径会引起各种怪异),但是我无法确切地知道它是什么。我还有许多其他参数化的查询,这些查询可以正常工作,但是这两个不起作用。有人以前见过这样的东西
答案 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);
其他提示:
MySqlCommand
和MySqlDataReader
均为IDisposable
,因此每个都应放在using
块中。string csvFolder = @"C:\\\\Users\\\\fakename\\\\Desktop\\\\csvScanner\\\\testeappfolder"
(这看起来仍然不正确,但等效于您提供的值) 。SELECT *
和ExecuteScalar
(仅使用第一行的第一个值)将来有被破坏的风险:更安全地选择要使用的特定列。LIKE
来查找一个值包含的参数,而该值似乎是根路径。如果该值将以该值开头,请删除初始通配符。