2

テーブルのデータを更新、挿入、または削除するために DataGridView を使用しています。コードはデータを非常にうまく挿入しますが、データまたは行を更新または削除するとエラーが発生します。コードは次のとおりです。

OleDbCommand sCommand;
    OleDbDataAdapter sAdapter;
    OleDbCommandBuilder sBuilder;
    DataSet sDs;
    DataTable sTable; 

    //Load Data...
    private void button1_Click(object sender, EventArgs e)
    {
        string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source= " + Application.StartupPath + @"\Label-Data.accdb";
        string sql = "SELECT * FROM _Default";
        OleDbConnection connection = new OleDbConnection(connectionString);
        connection.Open();
        sCommand = new OleDbCommand(sql, connection);
        sAdapter = new OleDbDataAdapter(sCommand);
        sBuilder = new OleDbCommandBuilder(sAdapter);
        sDs = new DataSet();
        sAdapter.Fill(sDs, "_Default");
        sTable = sDs.Tables["_Default"];
        connection.Close();
        dataGridView1.DataSource = sDs.Tables["_Default"];
        dataGridView1.ReadOnly = true;
        button4.Enabled = false;
        dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
    }

    //Add or Edit...
    private void button2_Click(object sender, EventArgs e)
    {
        dataGridView1.ReadOnly = false;
        button4.Enabled = true;
        button2.Enabled = false;
        button3.Enabled = false;
    }

    //Delete...
    private void button3_Click(object sender, EventArgs e)
    {
        if (MessageBox.Show("Do you want to delete this row ?", "Delete", MessageBoxButtons.YesNo) == DialogResult.Yes)
        {
            dataGridView1.Rows.RemoveAt(dataGridView1.SelectedRows[0].Index);
            sAdapter.Update(sTable);
        }
    }

    //Save...
    private void button4_Click(object sender, EventArgs e)
    {
        sAdapter.Update(sTable);
        dataGridView1.ReadOnly = true;
        button4.Enabled = false;
        button2.Enabled = true;
        button3.Enabled = true;
    }

sAdapter.Update(sTable); でエラーが発生します。エラーは

クエリ式の構文エラー '((ID = ?) AND ((? = 1 AND Prn IS NULL) OR (Prn = ?)) AND ((? = 1 AND _Copy IS NULL) OR (_Copy = ?)) AND ( (? = 1 AND _Item IS NULL) OR (_Item = ?)) AND ((? = 1 AND _Design IS NULL) OR (_Design = ?)) AND ((? = 1 AND Tray_No IS NULL) OR (Tray_No = ? )) と (('。

このエラーを解消するにはどうすればよいですか?

4

2 に答える 2

0

これを試して。

 private void button3_Click(object sender, EventArgs e)
 {
    if (MessageBox.Show("Do you want to delete this row ?", "Delete",     MessageBoxButtons.YesNo) == DialogResult.Yes)
    {
        dataGridView1.Rows.RemoveAt(dataGridView1.SelectedRows[0].Index);
       string sql="write your Delete query"
      OleDbCommand dCommand = new OleDbCommand(sql, connection);
        OleDbCommandBuilder builder = new OleDbCommandBuilder(sAdapter);
       sAdapter.DeleteCommand=dCommand
        sAdapter.Update(sTable);
    }
}

//Save...
private void button4_Click(object sender, EventArgs e)
{
     string sql="write your update query"
     OleDbCommand uCommand = new OleDbCommand(sql, connection);
     OleDbCommandBuilder builder = new OleDbCommandBuilder(sAdapter);
     sAdapter.UpdateCommand=uCommand 
    sAdapter.Update(sTable);
    dataGridView1.ReadOnly = true;
    button4.Enabled = false;
    button2.Enabled = true;
    button3.Enabled = true;
}
于 2013-01-25T09:02:39.113 に答える
0

本当に奇妙なフィールド名がいくつかあります。先頭のアンダースコアは何ですか??

しかし、フレームワークが挿入および更新 SQL の自動生成に失敗しているようです。

独自の UPDATE ステートメントと INSERT ステートメントをアダプターに追加する方法について説明している、次のSOの質問を見てください。

または、VisualStudio の DataSet デザイナーを使用して調べることもできます。

于 2013-01-25T09:19:44.393 に答える