2

IDというテキストボックスと保存ボタンがあります。保存ボタンをクリックすると、テキストボックスに書いたものをSQLiteデータベースファイルに単純に保存したいと思います。

コードはコンパイルされており、プログラムはエラーなしで実行されていますが、同じアプリケーションで作成したデータベース ファイル (file1.db) にレコードが保存されていません。

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
    private SQLiteConnection sqlcon;
    private SQLiteCommand sqlcmd;
    private SQLiteDataAdapter dataBase;
    private DataSet dataSet = new DataSet();
    private DataTable dataTable = new DataTable();


    public Form1()
    {
        InitializeComponent();
    }

    private void createDataBase()
    {
       dataBase = new SQLiteDataAdapter();
    }

    private void ExecuteQuery(string txtQuery)
    {            
     using (SQLiteConnection sqlcon = new SQLiteConnection("Data Source=file1.db"))
     {
            using (SQLiteCommand sqlcmd = sqlcon.CreateCommand())
            {
                sqlcon.Open();
                sqlcmd.CommandText = txtQuery;
                sqlcmd.ExecuteNonQuery();
            }
        }
    }

    private void createDataTable()
    {
        dataTable = new DataTable();
        string txtQuery1 = "CREATE TABLE RECORDS ( ID varchar(255))";
        ExecuteQuery(txtQuery1);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        string txtQuery2 = "INSERT INTO RECORDS (ID) VALUES ('" + textBox1.Text + "')";
        ExecuteQuery(txtQuery2);
    }
4

2 に答える 2

2

いくつかのこと。

まず、メソッドにクエリを実際に渡している場所がわかりませんExecuteQuery。ボタンのクリック方法を次のように変更する必要があります。

protected void button1_Click(object sender, EventArgs e)
{
  string txtQuery = "INSERT INTO RECORDS ID VALUES  ('" + textBox1.Text + "')";
  ExecuteQuery(txtQuery);
}

次に、クエリ自体が奇妙に見えます。通常、構造は次のようなものです

INSERT INTO RECORDS(ID) VALUES('myvalue')

直接実行してみましたか?

最後に、これを書き直して、グローバル接続とコマンド変数を削除することを強くお勧めします。悪い習慣であることに加えて、メモリリークが発生し、一般的に他の問題を引き起こす可能性があります。SQLiteConnection や SQLiteCommand など、IDisposable を実装するものはすべて、using 句でラップする必要があります。例えば:

using (SQLiteConnection conn = new SQLiteConnection("conn string")) {
  using (SQLiteCommand cmd = conn.CreateCommand()) {
    sqlcmd.CommandText = txtQuery;
    sqlcmd.ExecuteNonQuery();    
  }
}

これは、各クエリの実行後に自動的にクリーンアップされます。また、接続プーリングにより、グローバル変数を使用してそれらをキャッシュした場合と同じくらい高速です。最後に、エラーが発生した場合、メモリ リークについて心配する必要はありません。

于 2012-06-20T23:12:52.690 に答える
1

クエリを実行していません。これを試して:

private void button1_Click(object sender, EventArgs e)
{
  string txtQuery = "INSERT INTO RECORDS ID VALUES    ('" + textBox1.Text + "')";  
  ExecuteQuery(txtQuery);
}
于 2012-06-20T23:13:20.143 に答える