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

时间:2011-11-22 12:16:31

标签: c# asp.net data-binding

数据绑定

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 个答案:

答案 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;
}