Таким способом нельзя передать список идентификаторов в запрос SQL. Ваш оператор SELECT
в его нынешнем виде ожидает, что передаваемый параметр будет одним значением, которое будет использоваться предложением WHERE
.
Если вы будете придерживаться этого запроса, вам нужно будет перебрать свой список и передать каждое значение по одному и сделать отдельный вызов базы данных, например:
string MysqlStatement = "SELECT OrganisationID, OrganisationName FROM tbl_organisation WHERE OrganisationID=@OrganisationID";
foreach(var id in userids)
{
MySqlParameter[] param = new MySqlParameter[1];
param[0] = new MySqlParameter("@OrganisationID", MySqlDbType.Int32);
param[0].Value = id;
ds = server.ExecuteQuery(CommandType.Text, MysqlStatement, param);
... add result to another list which is used to databind to your grid
}
Лучшей альтернативой было бы использование предложения WHERE...IN...
и передача всех ваших идентификаторов за один раз, поскольку это вызовет только один вызов базы данных, и нет необходимости передавать параметры:
string MysqlStatement = string.Format("SELECT OrganisationID, OrganisationName FROM tbl_organisation WHERE OrganisationID IN ({0})", String.Join(",", userIds));
ds = server.ExecuteQuery(CommandType.Text, MysqlStatement, null);
Ваш третий вариант - написать хранимую процедуру, которая приняла бы представление вашего списка в формате XML и использовала его для запроса к базе данных, хотя это несколько сложнее. Этот способ позволяет вам придерживаться параметра.
Примечание: обычно очень плохая практика - не передавать динамические данные в качестве параметров, так как это может оставить вас открытыми для атак внедрения Sql, но в этом случае, поскольку данные поступают из параметра List, переданного в ваш метод, вы можете быть справедливым уверен, что он не помешает вашей базе данных.