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

本文关键字:一个 列表 参数 c#databinding | 更新日期: 2023-09-27 18:15:20

数据绑定

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

我将一个值列表传递给数据绑定方法。我传递一个带有organizationID的列表。我应该如何进行数据绑定。它正在返回一个空数据集。我正在传递值为60、61、62的列表。我得到的错误是

无法将"System.Collections.Generic.List `1[System.Int32]"类型的对象强制转换为"System.IConvertable"类型。

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

不能以这种方式将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参数,您可以相当肯定它不会干扰数据库。

在您的代码中,您在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;
}