2

現在、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(...)?
}

乾杯!

4

1 に答える 1

3

INSERT、UPDATE、および DELETE 操作は、DbCommand の機能です。INSERT に使用する SQL 文字列と SQLiteParameter のコレクションを受け取る別のメソッドが必要です。

INSERT 操作の疑似コードを書いてみます。

public class MyHelperClass
{
    public static int InsertCommand(string sql, SQLiteParameter[] parameters)
    {
        int result = 0;
        using (SQLiteConnection connection = new SQLiteConnection(connectionString))
        using (SQLiteCommand cmd = new SQLiteCommand(sql, connection))
        {
            cmd.Parameters.AddRange(parameters);
            result = cmd.ExecuteNonQuery();
        }  
        return result;
    }
}

次に、ヘルプ メソッドに渡すパラメーター配列を作成する必要があります。これは、UI コードから行う必要があります。

string sqlCommand = "INSERT INTO table1 (FirstName, LastName) VALUES (@fName, @lName)";
SQLiteParameter[] p = new SQLiteParameter[2];
p[0] = new SQLiteParameter("@fName", TextBox1.Text);
p[1] = new SQLiteParameter("@lName", TextBox2.Text);
int rowAdded = MyHelperClass,InsertCommand(sql, p);

UPDATE コマンドと DELETE コマンドの操作は似ています。また、文字列連結を使用して SQL コマンドを作成する代わりに、パラメーター配列を受け入れるバージョンの GetDataTable を追加することをお勧めします。ここで何度も繰り返される文字列の連結はエラーにつながり、最悪の場合、SQL インジェクションに簡単にさらされる脆弱なコードになります。

于 2013-05-04T13:00:42.357 に答える