【问题标题】:How to pass a list of values as parameter in c# databinding如何在 c# 数据绑定中将值列表作为参数传递
【发布时间】:2017-08-27 09:44:14
【问题描述】:

数据绑定

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

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

无法将“System.Collections.Generic.List`1[System.Int32]”类型的对象转换为“System.IConvertible”类型。

【问题讨论】:

  • 您正在尝试将列表设置为数据库中的整数值。您可以对列表中的项目执行此操作,但不能使用列表本身。你想达到什么目的?
  • 我对代码做了一些更改,但它只返回最后一个值记录

标签: c# asp.net data-binding


【解决方案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 参数,您可以公平确保它不会弄乱您的数据库。

【讨论】:

    【解决方案2】:

    在您的代码中,您在 for 循环中设置参数。由于您只有一个参数,并且在 for 循环中设置了相同的 time 和 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-29
      • 2012-03-07
      • 2020-08-03
      • 2010-11-30
      • 1970-01-01
      • 2016-08-05
      • 2013-04-21
      相关资源
      最近更新 更多