1

MS Access dbテーブルにデータを読み取り/更新および挿入できる単純なwinformアプリケーションを作成しようとしています

アプリケーションを実行すると、MS Access db からデータが読み取られ、新しいデータを追加したり、既存のデータを編集したりできますが、それらの変更は DB に送り返されません。

私の保存ボタンクリックイベントのコード

    Validate();
    myBindingSource.EndEdit();

    //myTableAdapterManager.UpdateAll(myDataSet.myTable); //this line was in generated code
    myTableAdapter.Update(myDataSet.myTable); //replaced previous row with this one, but with no effect

「保存」ボタンを押したら

エラー メッセージは表示されません。DataGridView では、新しい行には値が -1 の ID が含まれており、新しい行はデータベースに追加されません。

何が問題なのですか?私は何が欠けていますか?

MS Access 2007 から mdb ファイルを開くと、このテーブルに新しい行を追加できます

This SO post は同じ問題についてのようですが、私の場合は役に立ちません

WinformsでC#を使用してdatagridviewを使用して新しい行を追加できません

[編集]

.xsd ファイルを開き、myTable の挿入クエリと更新クエリを追加しましたが、それでも解決しません。[保存] ボタンを押しても、変更がデータベースに送信されません。

4

1 に答える 1

0

グリッドコントロールからデータベースにデータを送信する方法を見つけました。他の人にも役立つことを願っています(+いくつかの便利な追加機能を追加しました)

これが私のコードです

//form level fields
        OleDbConnection conn = new OleDbConnection();
        OleDbDataAdapter adapter;// = new OleDbDataAdapter();
        DataTable table = new DataTable();
        BindingSource bSource = new BindingSource();

//choosing MS Access file 
        var ecgDbFile = new OpenFileDialog();
        ecgDbFile.InitialDirectory = "c:\\";
        ecgDbFile.Filter = @"MS Access files (*.mdb)|*.mdb";
        ecgDbFile.FilterIndex = 1;
        ecgDbFile.RestoreDirectory = true;

//creating connection
        conn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + ecgDbFile.FileName;
        conn.Open();

//A nice way how to get a list of Data base's tables
        var restrictions = new string[4];
        restrictions[3] = "Table";
        userTableList = conn.GetSchema("Tables", restrictions);
//then loop through and you can get table names => userTableList.Rows[i][2].ToString()

//reading the data (in the grid)
        adapter = new OleDbDataAdapter("Select * from "+TableName, conn);
        adapter.Fill(table);
        bSource.DataSource = table; //binding through bindingsource
        GridControl.DataSource = bSource; //actually it works fine if GridControl.DataSource is set to table directly as well...

//choose the appropriate trigger (some gridcontrol or button click event) to call for database updates
    private void GridControl_Leave(object sender, EventArgs e)
    {
        //because of this OleDbCommandBuilder TableAdapter knows how to insert/update database
        OleDbCommandBuilder command = new OleDbCommandBuilder(adapter);
        adapter.Update(table);
    }
于 2013-09-24T21:17:01.593 に答える