我有一个带有MySql数据库的Asp.Net应用程序。要访问此数据库,我使用数据集(.xsd),我将查询放在TableAdapters中。其中一个查询有一个WHERE IN
子句,如:
SELECT somefield
FROM sometable
WHERE somefield IN (?)
此somefield
是字符串值。 TableAdapter函数需要一个字符串参数来替换查询参数。但是,我想传递List<string>
(或数组或任何其他类型)来检查多个值。我到目前为止找到的唯一方法是将列表转换为逗号分隔列表:
GetData(string.Join(",", myList.ToArray());
只要列表中只有一个值,它就可以正常工作。使用两个值,查询返回0行。我激活了MySql中的常规日志,发现它与引号有关。到达数据库的查询是:
SELECT somefield
FROM sometable
WHERE somefield IN ('foo,bar')
我在加入值时添加了额外的引号:
GetData(string.Join("','", myList.ToArray());
但是额外的引号只会被转义,结果仍然是0行:
SELECT somefield
FROM sometable
WHERE somefield IN ('foo\',\'bar')
现在我看到的唯一选项是将每个字符串转换为id并将这些整数连接成一个字符串。就像this线程一样。但这意味着要对数据库进行大量额外调用才能获得这些id。我更喜欢使用字符串值!
谁知道如何解决这个难题?
答案 0 :(得分:0)
试试这个:
GetData(String.Format("'{0}'", String.Join(",", myList.ToArray()));
如果单引号被转义,请加倍,例如:
GetData(String.Format("''{0}''", String.Join(",", myList.ToArray()));
答案 1 :(得分:0)
TableAdapter将继续转义引号。您可以创建一个用户定义的函数,该函数采用逗号分隔的参数并将其作为行返回。这样您就可以按如下方式访问该功能。我以前用T-SQL做过这个。它应该在MySQL中可行。
SELECT somefield
FROM sometable
WHERE somefield IN UDFDelimitedToRows(?)