繁体   English   中英

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

[英]How to pass a list of values as parameter in c# 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”。

您不能以这种方式将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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM