数据绑定
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'。
答案 0 :(得分:1)
您不能以这种方式将id列表传入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...
子句并一次性传递所有id,因为这只会触发一个数据库调用,并且不需要传入参数:
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参数,所以您可以公平确保它不会弄乱你的数据库。
答案 1 :(得分:1)
在您的代码中,您将在for循环中设置参数。由于您有一个参数并在for循环中设置相同的时间和agian,列表中的最后一个值将有效地设置为循环的最后一次迭代中的参数。
如果您需要传递一个列表并且需要获取一组满足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;
}