如何在c#databinding中将值列表作为参数传递

时间:2014-01-22 14:55:52

标签: c# mysql asp.net dataset mysql-connector

我有一个带有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。我更喜欢使用字符串值!

谁知道如何解决这个难题?

2 个答案:

答案 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(?)