System.Data.SQLite.dllを追加します。
usingを追加します。
using System.Data.SQLite;
適当なデータを用意します。
今回は、都道府県と県庁データとしときます。
テーブルはこんな感じ。
CREATE TABLE [sample] ( [pref] TEXT, [capital] TEXT, PRIMARY KEY(pref) );
フォームにDataGridViewを配置します。
データを読み込みます。
private void Form1_Load(object sender, EventArgs e) { string dbPath = Application.StartupPath + @"\Data.db"; using (SQLiteConnection con = new SQLiteConnection("Data Source=" + dbPath)) { //空のテーブルを作ります。 //この時点では、DataGridViewと紐づいていません。 DataTable dataTable = new DataTable(); //DataTableに読み込むデータをSQLで指定します。 //今回はDataTableを指定していないので、SELECTで表示する列名が //のちのち紐づけを行った際のDataGridViewの列名になります。 SQLiteDataAdapter adapter = new SQLiteDataAdapter("SELECT * FROM sample;", con); adapter.Fill(dataTable); //データテーブルをDataGridViewに紐づけます。 this.dataGridView1.DataSource = dataTable; } }
■表示をクリアする
DataTableとDataGridViewをbindingしていると this.DataGridView1.Rows.Clear() ではクリアできません。
DataGridViewはあくまでもDataTableの内容をただ表示しているだけなので、DataTable自身をクリアしないといけません。
using System; using System.Data; using System.Data.SQLite; using System.Windows.Forms; namespace WindowsFormsApplication2 { public partial class Form1 : Form { private DataTable datatable { get; set; } public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { string dbPath = Application.StartupPath + @"\Data.db"; using (SQLiteConnection con = new SQLiteConnection("Data Source=" + dbPath)) { con.Open(); //空のテーブルを作ります。 //この時点では、DataGridViewと紐づいていません。 this.datatable = new DataTable(); //DataTableに読み込むデータをSQLで指定します。 //今回はDataTableを指定していないので、SELECTで表示する列名が //のちのち紐づけを行った際のDataGridViewの列名になります。 SQLiteDataAdapter adapter = new SQLiteDataAdapter("SELECT * FROM sample;", con); adapter.Fill(this.datatable); //データテーブルをDataGridViewに紐づけます。 this.dataGridView1.DataSource = this.datatable; } } private void BtnClear_Click(object sender, EventArgs e) { this.datatable.Clear(); } } }
表示を消したなら、再表示したいとこですね。
Readボタンを追加。
using System; using System.Data; using System.Data.SQLite; using System.Windows.Forms; namespace WindowsFormsApplication2 { public partial class Form1 : Form { private DataTable datatable { get; set; } private SQLiteConnection con { get; set; } private SQLiteDataAdapter adapter { get; set; } public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { string dbPath = Application.StartupPath + @"\Data.db"; this.con = new SQLiteConnection("Data Source=" + dbPath); this.con.Open(); //空のテーブルを作ります。 //この時点では、DataGridViewと紐づいていません。 this.datatable = new DataTable(); //データテーブルをDataGridViewに紐づけます。 this.dataGridView1.DataSource = this.datatable; //データを読み込みます this.DataRead(); } private void BtnClear_Click(object sender, EventArgs e) { this.datatable.Clear(); } private void BtnRead_Click(object sender, EventArgs e) { this.DataRead(); } private void DataRead() { //DataGridViewにどんどん追加されるので、一度初期化してから追加する this.datatable.Clear(); adapter = new SQLiteDataAdapter("SELECT * FROM sample;", con); adapter.Fill(this.datatable); } } }
最後にDataGridViewの内容を変更した結果をDBに反映します。
using System; using System.Data; using System.Data.SQLite; using System.Windows.Forms; namespace WindowsFormsApplication2 { public partial class Form1 : Form { private DataTable datatable { get; set; } private SQLiteConnection con { get; set; } private SQLiteDataAdapter adapter { get; set; } public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { string dbPath = Application.StartupPath + @"\Data.db"; this.con = new SQLiteConnection("Data Source=" + dbPath); this.con.Open(); //空のテーブルを作ります。 //この時点では、DataGridViewと紐づいていません。 this.datatable = new DataTable(); //データテーブルをDataGridViewに紐づけます。 this.dataGridView1.DataSource = this.datatable; //データを読み込みます this.DataRead(); } private void BtnClear_Click(object sender, EventArgs e) { this.datatable.Clear(); } private void BtnRead_Click(object sender, EventArgs e) { this.DataRead(); } private void DataRead() { //DataGridViewにどんどん追加されるので、一度初期化してから追加する this.datatable.Clear(); adapter = new SQLiteDataAdapter("SELECT * FROM sample;", con); adapter.Fill(this.datatable); } private void BtnUpdate_Click(object sender, EventArgs e) { try { using(SQLiteTransaction trans = this.con.BeginTransaction()) { SQLiteCommandBuilder builder = new SQLiteCommandBuilder(this.adapter); builder.SetAllValues = false; builder.ConflictOption = ConflictOption.OverwriteChanges; this.adapter.Update(this.datatable); trans.Commit(); } MessageBox.Show("Update完了"); } catch (Exception ex) { MessageBox.Show(ex.Message); } } } }
SQLiteCommandBuilderがDataTableの列名や主キーなどの情報と
変更内容から適宜、SQLを組み立てて実行してくれます。
ちなみに、下記のようにBtnUpdate_Clickを書き換えると・・・
private void BtnUpdate_Click(object sender, EventArgs e) { try { using(SQLiteTransaction trans = this.con.BeginTransaction()) { SQLiteCommandBuilder builder = new SQLiteCommandBuilder(this.adapter); builder.SetAllValues = false; builder.ConflictOption = ConflictOption.OverwriteChanges; MessageBox.Show(builder.GetUpdateCommand().CommandText); MessageBox.Show(builder.GetInsertCommand().CommandText); MessageBox.Show(builder.GetDeleteCommand().CommandText); int ret = this.adapter.Update(this.datatable); trans.Commit(); string message = string.Format("Update完了\n{0}件変更", ret); MessageBox.Show(message); } } catch (Exception ex) { MessageBox.Show(ex.Message); } }
SQLiteCommandBuilderは、自動的に状況に応じてSQLを発行してくれるのでとても便利ではあるのですが
当然ながら万能なものではないので、あらゆるものがUpdateしたりDeleteしたりできるわけではないです。
そのため、主キーを利用したものに限られます。
あと、this.adapter.Update(this.datatable)で変更のレコード数を返します。
これは、Readするときに使っている
adapter.Fill(this.datatable);
も戻り値としてintの変数で受けるとSelectした行数が取得できます。
0 件のコメント:
コメントを投稿