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 ループでこのブロックが含まれていることがわかるように、何度も実行されるため、DB から取得した各行をデータテーブルに追加したいと考えています。そのため、データテーブルが返されると、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]; ... イテレーション内でのオブジェクト宣言は避けます... ループが忙しすぎるように見えます... また、どこに行くかのようなものを使用する代わりに i、 where をうまく利用することができます.....to連結されたデータを保存できるようにします。for loop[0],[i]dt

于 2013-06-12T19:47:40.167 に答える
0

クエリを 1 回実行できると思います。これらすべてのオブジェクトをループで作成する必要はありません。

              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 に答える