0

私の脳には比較的単純なタスクがありますが、それを機能させることができないため、予想よりもはるかに困難です。私は C# で作業しており、csv ファイルから DataTable にデータを解析しようとしています。これを SQL データベースに挿入したいと考えています。将来、データベース ファイルから作業できるように、これを実行したいと考えています (CSV ファイルよりも高速で簡単になることを願っていますが、これが間違っている場合は教えてください)。

データをデータテーブルに入れることができます。次に、データベース ファイルの内容と一致するように列の名前を変更します。次に、データセットを作成し、データセットの "Table1" としてデータ テーブルを追加します。

ただし、SqlDataAdaptor から「Update」メソッドを呼び出すと、データベースでデータが更新されていないように見えることを除いて、コードは正常に実行されます。私はちょっとしたばかげた間違いをしているだけだと思う​​ので、私はC#とOOP全般に比較的慣れていないので、お詫びします。

以下は私が使用しようとしているコードです:

    SqlConnection con;
    DataTable dt1;
    SqlDataAdapter da;

    private void Form1_Load(object sender, EventArgs e)
    {
        con = new SqlConnection();
        con.ConnectionString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=C:\\dbTestCSV.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";
        con.Open();

        string sql = "SELECT * FROM tblTestCSV";
        da = new SqlDataAdapter(sql, con);

        SqlCommandBuilder cb;
        cb = new SqlCommandBuilder(da);

        dt1 = ParseCSV("C:\\testcsv2.csv");

        dt1.Columns[0].ColumnName = "Numbers";
        dt1.Columns[1].ColumnName = "Col1";
        dt1.Columns[2].ColumnName = "Col2";
        dt1.Columns[3].ColumnName = "Col3";
        dt1.Columns[4].ColumnName = "Col4";
        dt1.Columns[5].ColumnName = "Col5";

        foreach (DataRow dr in dt1.Rows)
        {
            dr.SetModified();
        }

        DataSet ds1 = new DataSet();
        ds1.Tables.Add(dt1);


        da.Fill(ds1);
        da.Update(ds1,"Table1");

        dataGridView1.DataSource = dt1;

        con.Close();
        da.Dispose();

        MessageBox.Show("sql server table data updated!");
    }

インターネットとスタックオーバーフローを調べましたが、遭遇したすべてのソリューションが理解できないか、機能しません。御時間ありがとうございます。

編集:コマンドビルダーの後にデータアダプターを再宣言しないように、コードを少し変更しました。ただし、コードは何もスローせずに実行され、最後にメッセージボックスがポップアップし、続いて dt1 からのデータを含むフォームが表示されますが、データベースはまだ更新されていません。

明確にするために、データベースからデータを取得していません。CSV ファイルからデータを取得し、データベースに移動しようとしています。これまでご協力いただきありがとうございました。他の提案はありますか?

編集 2: DataTable "dt1" の構造は次のとおりです。

ヘッダー: 数字 Col1 Col2 Col3 Col4 Col5

データ型: int32 Str Str Str Str Str

25列あり。

dbTestCsv.mdf ファイルのテーブルは次のとおりです。

ヘッダー: 数字 Col1 Col2 Col3 Col4 Col5

データ型: int nvarchar(50) -->

行/データはまだありません。

編集 3: Heyooo!! 動作しました。それは本質的にここでの提案の融合でしたので、皆さんに感謝します!

4

3 に答える 3

1

データセットを埋めるために共通のコードを使用してDataTableを作成し、csvファイルにある値を追加して、最初の状態に応じて新しい値を検出できるようにすることで、スターを付ける方がよいと思います。この場合、更新は機能します。
それが役に立てば幸い

于 2012-07-16T16:27:28.647 に答える
0

これが最終的に機能したコードです。現在、データには約 24000 行 (テスト用) があり、それに応じて DB が更新されます (ただし、コンパイル/実行には約 4 秒かかります)。ご協力いただきありがとうございます。

    SqlConnection con;
    DataTable dt1;
    SqlDataAdapter da;

    private void Form1_Load(object sender, EventArgs e)
    {
        con = new SqlConnection();
        con.ConnectionString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=C:\\dbTestCSV.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";
        con.Open();

        string sql = "SELECT * FROM tblTestCSV";
        da = new SqlDataAdapter(sql, con);

        SqlCommandBuilder cb;
        cb = new SqlCommandBuilder(da);

        dt1 = ParseCSV("C:\\testcsv3.csv");

        dt1.Columns[0].ColumnName = "Numbers";
        dt1.Columns[1].ColumnName = "Col1";
        dt1.Columns[2].ColumnName = "Col2";
        dt1.Columns[3].ColumnName = "Col3";
        dt1.Columns[4].ColumnName = "Col4";
        dt1.Columns[5].ColumnName = "Col5";

        DataSet ds2 = new DataSet();

        da.Fill(ds2);

        // THIS IS THE KEY BIT!! This adds the rows from the datatable to the dataset one by one.
        // I guess the "Update" command in the dataadapter needs this to happen, rather than just 
        // adding the table "dt1" to the dataset all at once. Can anyone explain why?

        foreach (DataRow dRow in dt1.Rows)
        {
            DataRow dsRow = ds2.Tables["Table"].NewRow();
            dsRow.ItemArray = dRow.ItemArray;
            ds2.Tables["Table"].Rows.Add(dsRow);
        }

        da.Update(ds2,"Table");

        dataGridView1.DataSource = dt1;

        con.Close();
        da.Dispose();
    }
于 2012-07-17T14:16:22.440 に答える
0

最初に SqlDataAdapter を使用して DataSet を埋めてから、更新メソッドを呼び出す必要があります

e.g. ds1.Fill(da); 
于 2012-07-16T16:08:33.053 に答える