現在、Windows フォームと SQLite を使用して小さなアプリケーションを作成しています。いくつかのチュートリアルを読んだ後、データ取得のためにこの方法を実装しました。
public DataTable GetDataTable(ref SQLiteDataAdapter adapter, string sql)
{
DataTable dt = new DataTable();
// Connect to database.
using (SQLiteConnection connection = new SQLiteConnection(connectionString))
// Create database adapter using specified query
using (adapter = new SQLiteDataAdapter(sql, connection))
// Create command builder to generate SQL update, insert and delete commands
using (SQLiteCommandBuilder command = new SQLiteCommandBuilder(adapter))
{
// Populate datatable to return, using the database adapter
adapter.Fill(dt);
}
return dt;
}
(SQLiteDataAdapter をパラメーターとしてとらない別の GetDataTable と同様)
UI、Link、および Database と呼びましょう。UI は、データを表示し、ユーザーの操作時にイベントを発生させるだけです。リンクは、データベースと SQLiteDataAdapter を作成し、上記の方法でデータ テーブルを取得し、UI のデータ グリッド ビューにバインドします。ユーザーは、データ グリッド ビューを使用してテーブルを変更することはできませんが、いくつかのテキスト ボックスを使用して変更する必要があります。(これは、テーブルを dgv にバインドすることを廃止しますか?)
アダプターを使用して、ユーザー入力をテキスト ボックスからデータベースに取得する最良の方法は何ですか? または、アダプターの代わりに DataReader と Insert メソッドを使用する必要がありますか?
ご存知のように、UI は Get メソッドを通じてそのコントロールを公開します。より良い解決策はありますか?
private void Initialize()
{
// Subscribe to userInterface events
userInterface.DataGridViewSelectionChanged += new EventHandler(userInterface_DataGridViewSelectionChanged);
userInterface.NewClicked += new EventHandler(userInterface_NewClicked);
userInterface.SaveClicked += new EventHandler(userInterface_SaveClicked);
// Get dataGridView from userInterface and bind to database
bindingSource = new BindingSource();
bindingSource.DataSource = database.GetDataTable(ref adapter, "SELECT * FROM SomeTable");
userInterface.GetDataGridView().DataSource = bindingSource;
}
void userInterface_DataGridViewSelectionChanged(object sender, EventArgs e)
{
if (userInterface.GetDataGridView().SelectedRows.Count != 0)
{
DataGridViewRow row = userInterface.GetDataGridView().SelectedRows[0];
userInterface.GetIDTextBox().Text = row.Cells["PrimaryKey].Value.ToString();
userInterface.GetOtherIDTextBox().Text = row.Cells["ForeignKey"].Value.ToString();
DataTable dt = database.GetDataTable("SELECT * from SomeTable WHERE ForeignKey=" + row.Cells["ForeignKey"].Value);
userInterface.GetLastNameTextBox().Text = dt.Rows[0]["LastName"].ToString();
userInterface.GetFirstNameTextBox().Text = dt.Rows[0]["FirstName"].ToString();
userInterface.GetCompanyTextBox().Text = dt.Rows[0]["Company"].ToString();
}
}
void userInterface_NewClicked(object sender, EventArgs e)
{
// Get all text boxes and clear them
// Let the UI take care of this by itself?
}
void userInterface_SaveClicked(object sender, EventArgs e)
{
// Get text/data from all text boxes and insert (or update if editing table) into database
// adapter.Update(...)?
}
乾杯!