【问题标题】:Contiously adding to datatable不断添加到数据表
【发布时间】:2013-06-12 19:30:56
【问题描述】:

我有下面的代码,它使用 OleDB 输出到数据库并用信息填充数据集。然后它会检查以确保它在数据集中有某些内容,如果有,则将该数据集添加到数据表中,然后在函数末尾返回该数据表。

for (int i = 0; i < UserClassDict[UserName].ControlNumber.Count; i++)
                    {
                        string query = "SELECT * FROM [FNF Taxes] WHERE ControlNumber =" + UserClassDict[UserName].ControlNumber[i] + ";";
                        adapter.SelectCommand = new OleDbCommand(query, conn);
                        DataSet dataset = new DataSet();
                        adapter.Fill(dataset);

                        if (dataset.Tables[0].Rows.Count > 0)
                        {
                            dt = dataset.Tables[0];
                                                }
                    }

我的问题是这样的。正如您可以通过 for 循环知道该块所在的那样,它将运行多次,我希望它从数据库中提取的每一行都添加到数据表中。因此,当返回数据表时,它具有所有 X 行。但是,就像在上面的代码块中一样,添加到数据表中的唯一行是被拉取的最新行。

【问题讨论】:

  • 我很难理解问题是什么。
  • 用于构建此 sql 的技术容易受到注入攻击。这个特定的查询可能没问题,因为它看起来 C# 对象是一种数字数据类型,但是如果您使用相同的技术将数据替换到查询中的其他查询,您实际上是在乞求被黑客入侵。
  • 可能是一些额外的代码可以帮助更好地帮助

标签: c# for-loop datatable oledb


【解决方案1】:

使用DataTable.Merge():

DataTable dt = null;
for (int i = 0; i < UserClassDict[UserName].ControlNumber.Count; i++)
{
    string query = "SELECT * FROM [FNF Taxes] WHERE ControlNumber =" + UserClassDict[UserName].ControlNumber[i] + ";";
    adapter.SelectCommand = new OleDbCommand(query, conn);
    DataSet dataset = new DataSet();
    adapter.Fill(dataset);

    if (dataset.Tables[0].Rows.Count > 0)
    {
        if (dt == null)
            dt = dataset.Tables[0].Clone();
        dt.Merge(dataset.Tables[0]);
    }
}
return dt;

【讨论】:

    【解决方案2】:

    我所知道的最直接的方法是继续加载 DataTable 的同一实例。考虑一个可能如下所示的类:

    private DataTable _dt = new DataTable();
    
    ...
    
    private void FillMyDataTable()
    {
        ...
        sda.Fill(_dt);
    }
    

    或者在你的情况下,DataSet。另一个选项是 Merge,它是由 DonBoitnott 作为解决方案提供的。

    【讨论】:

      【解决方案3】:

      尝试在此级别应用串联方法 dt = dataset.Tables[0]; ...我会避免在迭代中声明对象...循环看起来太忙...此外,您可以在for loop 中充分利用i,而不是使用[0], 之类的东西,您可以使用[i] .....以允许dt 存储连接数据。

      【讨论】:

        【解决方案4】:

        我相信您可以运行一次查询。您不必在循环中创建所有这些对象。

                      string where = "";
                       string query = "SELECT * FROM [FNF Taxes] WHERE ControlNumber = {0};";
                       for (int i = 0; i < UserClassDict[UserName].ControlNumber.Count; i++)
                       {
                           if(i == UserClassDict[UserName].ControlNumber.Count -1 )
                              where+=UserClassDict[UserName].ControlNumber[i] ;
                           else
                               where += UserClassDict[UserName].ControlNumber[i] + ",";
        
                       }
        
                       adapter.SelectCommand = new OleDbCommand(string.Format( query,where), conn);
                       DataSet dataset = new DataSet();
                       adapter.Fill(dataset);
        
                       if (dataset.Tables[0].Rows.Count > 0)
                       {
                           if (dt == null)
                               dt = dataset.Tables[0];
                       }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-08-23
          • 1970-01-01
          • 1970-01-01
          • 2019-11-26
          • 1970-01-01
          • 2013-04-17
          • 2015-03-03
          • 2016-04-23
          相关资源
          最近更新 更多