【问题标题】:Problem in populating the GridView in ASP.NET(C#)在 ASP.NET(C#) 中填充 GridView 的问题
【发布时间】:2011-06-11 16:39:48
【问题描述】:

我正在尝试用循环的结果填充Gridview。但我只得到循环中的最后一个结果。
我认为每次执行 for 循环时都会覆盖 GridView

请大家帮我解决这个问题。

for (int j = 0; j < i; j++)
{
    Label1.Text += fipath[j];
    Label1.Text += "-------------";
    SqlConnection conn = new SqlConnection("Server=ILLUMINATI;" + "Database=DB;Integrated Security= true");
    SqlCommand comm = new SqlCommand("Select * from FileUpload where UploadedBy='" + NAME + "' AND FilePath='" + fipath[j] + "'", conn);

    try
    {
        conn.Open();
        SqlDataReader rdr = comm.ExecuteReader();
        if (Role.Equals("admin"))
        {
            GridView1.DataSource = rdr;
            GridView1.DataBind();
        }
        rdr.Close();
    }
    catch
    {
        conn.Close();
    }
}

【问题讨论】:

    标签: c# .net asp.net sql gridview


    【解决方案1】:

    这段代码有不止一个问题:

    • 好像Role== "admin" 你根本不需要查询数据库
    • 每次循环迭代都会覆盖网格的DataSource,这就是为什么您只能看到最后一个值。
    • 使用SqlCommand 的参数来防止SQL 注入。
    • 不要在循环中运行字符串连接。请改用StringBuilder
    • 使用using 进行连接。这样代码更简洁。

    修复可能如下所示:

    if (Role != "admin")
        return;
    
    var dataTable = new DataTable();
    var stringBuilder = new StringBuilder();
    using (var connection = new SqlConnection("Server=ILLUMINATI;" + "Database=DB;Integrated Security= true"))
    using (var command = connection.CreateCommand())
    {
        connection.Open();
        command.CommandText = "Select * from FileUpload where UploadedBy = @UploadedBy AND FilePath = @FilePath";
        command.Parameters.AddWithValue("UploadedBy", NAME);
        var filPathParameter = command.Parameters.Add("FilePath", SqlDbType.VarChar);
        for (int j = 0; j < i; j++)
        {
            stringBuilder.Append(fipath[j]);
            stringBuilder.Append("-------------");
            filPathParameter.Value = fipath[j];
            dataTable.Load(command.ExecuteReader(), LoadOption.PreserveChanges);
        }
    }
    Label1.Text += stringBuilder.ToString();
    GridView1.DataSource = dataTable;
    GridView1.DataBind();
    

    另外,我不知道你的正常循环有多少元素。如果它是一两个,并且您在 FileUpload 表中有适当的索引,那么可以保持原样。但是,如果您需要多次执行此操作,则应考虑改用单个查询

    例如:

    var filePathes = string.Join(",", fipath.Select(arg => "'" + arg + "'"));
    var command = "Select * from FileUpload where UploadedBy = @UploadedBy AND FilePath in (" + filePathes + ")";
    

    此查询容易发生 SQL 注入。并且在 MS SQL 中有 2100 个元素的限制。

    解决这个问题的方法不止一种。取决于您的 DBMS 和要求。

    【讨论】:

      【解决方案2】:

      在 SQL Query 中使用 in 子句并在 FilePath 中传递 ID 列表

      SqlCommand comm = new SqlCommand("Select * from FileUpload where UploadedBy='" + NAME 
       + "' AND FilePath in (" + listOfIDs + ")", conn);
      

      查看这些与使用in 子句相关的URL。

      Techniques for In-Clause and SQL Server

      Parameterizing a SQL IN clause?

      【讨论】:

      • 它看起来是正确的。但由于某种原因它没有给出任何结果。
      • 我删除了 for 循环并给出了 fipath 而不是 fipath[j]。它什么也没打印。
      • 如果您有 SQL 服务器,您必须在参数中提供 Id 列表,例如... in(1,2,3,4),只需验证那里的查询并在 SQL 命令中复制该查询。从 FileUpload 中选择 *,其中 uploadby='' 和 Filepath(1,3,4,5)
      【解决方案3】:

      在循环外创建一个列表或 BindingSource,将其绑定到您的 gridview,然后将所有记录添加到该列表或源中。

      您当前方法的问题是您每次都用新的数据源覆盖从数据库中提取的记录,因此正如您所说,只有最后一个是“设置”的,并且旧的分配被处理掉了。

      【讨论】:

      • 如何动态地将项目添加到列表中。你能告诉我吗。
      • @ILLUMINATI7590:使用来自IDataReader(您的rdr 实例)的Read 方法,并使用Add 方法将对象添加到实例中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多