1

我有下面的代码,它使用 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 行。但是,就像在上面的代码块中一样,添加到数据表中的唯一行是被拉出的最新行。

4

4 回答 4

3

使用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;
于 2013-06-12T19:35:18.150 回答
0

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

private DataTable _dt = new DataTable();

...

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

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

于 2013-06-12T19:43:55.807 回答
0

尝试在此级别应用 Concatenation 方法dt = dataset.Tables[0]; ...我会避免在迭代中声明对象...循环看起来太忙了...此外,您可以ifor loopwhere 中充分利用,而不是像 [0],您想要的那样[i]......允许dt存储级联数据。

于 2013-06-12T19:47:40.167 回答
0

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

              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];
               }
于 2013-06-12T19:49:18.027 回答