Как передать список значений в качестве параметра в привязке данных C # - PullRequest
0 голосов
/ 22 ноября 2011

Databinding

private DataSet BindGridView(List<int> userids)
   { DataSet ds = new DataSet();
     string MysqlStatement = "SELECT OrganisationID, OrganisationName FROM tbl_organisation WHERE OrganisationID=@OrganisationID";
    MySqlParameter[] param = new MySqlParameter[1];     
     foreach (var OrgID in userids)
    {
        param[0] = new MySqlParameter("@OrganisationID", MySqlDbType.Int32);
        param[0].Value = OrgID;
        ds = server.ExecuteQuery(CommandType.Text, MysqlStatement, param);
        ds.Merge(ds);
    }
    Grid_Organisationtable.DataSource = ds;
    Grid_Organisationtable.Columns[0].Visible = false;
    Grid_Organisationtable.DataBind();
    return ds;
}

Я передаю список значений методу привязки данных. Я передаю список с OrganistionID. как я должен сделать привязку данных. Он возвращает пустой набор данных. Я передаю список со значениями вроде 60,61,62. Я получаю ошибку

Невозможно привести объект типа «System.Collections.Generic.List`1 [System.Int32]» к типу «System.IConvertible».

Ответы [ 2 ]

1 голос
/ 22 ноября 2011

В вашем коде вы устанавливаете параметр в цикле for.Поскольку у вас есть один параметр и вы устанавливаете одно и то же время и значение agian в цикле for, последнее значение в списке будет эффективно установлено для параметра в последней итерации цикла.

Если вам нужно передатьсписок и нужно получить набор записей, которые соответствуют списку в условии where, альтернативой является использование условия where .. in.

Таким образом, ваш эффективный код может выглядеть примерно так:

private DataSet BindGridView(List<int> userids)
   { DataSet ds = new DataSet();
     string MysqlStatement = string.format("SELECT OrganisationID, OrganisationName FROM tbl_organisation WHERE OrganisationID in ({0})", String.Join(",", userIds));
    MySqlParameter[] param = new MySqlParameter[1];     
    ds = server.ExecuteQuery(CommandType.Text, MysqlStatement, null);
    Grid_Organisationtable.DataSource = ds;
    Grid_Organisationtable.Columns[0].Visible = false;
    Grid_Organisationtable.DataBind();
    return ds;
}
1 голос
/ 22 ноября 2011

Таким способом нельзя передать список идентификаторов в запрос 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, переданного в ваш метод, вы можете быть справедливым уверен, что он не помешает вашей базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...