私の脳には比較的単純なタスクがありますが、それを機能させることができないため、予想よりもはるかに困難です。私は 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!! 動作しました。それは本質的にここでの提案の融合でしたので、皆さんに感謝します!