C# 在c中更新/编辑从dataGridView到ms access数据库的数据#

C# 在c中更新/编辑从dataGridView到ms access数据库的数据#,c#,sql,ms-access,datagridview,C#,Sql,Ms Access,Datagridview,我有一个问题要解决好几个小时。现在是凌晨2点,即使读完文章的语气,我仍然无法解决这个问题。 我有一个c#windows应用程序,可以将ms access数据库中的数据加载到dataGridView中。 我可以成功地加载它,添加新记录并保存它。但是,当我尝试编辑/删除行并保存它时,我得到错误: 对于不返回任何键列信息的SelectCommand,不支持DeleteCommand的动态SQL生成 我不知道该怎么办。我真的很感谢你的帮助 public class UserInterfaceForm:

我有一个问题要解决好几个小时。现在是凌晨2点,即使读完文章的语气,我仍然无法解决这个问题。 我有一个c#windows应用程序,可以将ms access数据库中的数据加载到dataGridView中。 我可以成功地加载它,添加新记录并保存它。但是,当我尝试编辑/删除行并保存它时,我得到错误: 对于不返回任何键列信息的SelectCommand,不支持DeleteCommand的动态SQL生成

我不知道该怎么办。我真的很感谢你的帮助

public class UserInterfaceForm: Form
{
    //db connection
    String connString;
    OleDbDataAdapter dAdapter;
    OleDbCommandBuilder cBuilder;
    DataTable dTable = new DataTable();
    BindingSource bSource;

    //buttons
    private Button SavePermitButton;
    private Button loadPermitButton;
    private Button exitButton;
    private Button deletePermitButton;

    //GridView
    private DataGridView allPermitsDataGridView;

    public UserInterfaceForm()
    {
        InitializeComponent();
    }

    void InitializeComponent()
    {
        this.SavePermitButton = new System.Windows.Forms.Button();
        this.loadPermitButton = new System.Windows.Forms.Button();
        this.allPermitsDataGridView = new System.Windows.Forms.DataGridView();
        this.exitButton = new System.Windows.Forms.Button();
        this.deletePermitButton = new System.Windows.Forms.Button();
        ((System.ComponentModel.ISupportInitialize)(this.allPermitsDataGridView)).BeginInit();
        this.SuspendLayout();
        // 
        // SavePermitButton
        // 
        this.SavePermitButton.Location = new System.Drawing.Point(115, 275);
        this.SavePermitButton.Name = "SavePermitButton";
        this.SavePermitButton.Size = new System.Drawing.Size(97, 25);
        this.SavePermitButton.TabIndex = 3;
        this.SavePermitButton.Text = "Save permit";
        this.SavePermitButton.UseVisualStyleBackColor = true;
        this.SavePermitButton.Click += new System.EventHandler(this.SavePermitButton_Click);
        // 
        // loadPermitButton
        // 
        this.loadPermitButton.Location = new System.Drawing.Point(12, 275);
        this.loadPermitButton.Name = "loadPermitButton";
        this.loadPermitButton.Size = new System.Drawing.Size(97, 25);
        this.loadPermitButton.TabIndex = 4;
        this.loadPermitButton.Text = "Load permit";
        this.loadPermitButton.UseVisualStyleBackColor = true;
        this.loadPermitButton.Click += new System.EventHandler(this.readPermitButton_Click);
        // 
        // allPermitsDataGridView
        // 
        this.allPermitsDataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
        this.allPermitsDataGridView.Location = new System.Drawing.Point(12, 12);
        this.allPermitsDataGridView.Name = "allPermitsDataGridView";
        this.allPermitsDataGridView.Size = new System.Drawing.Size(839, 239);
        this.allPermitsDataGridView.TabIndex = 8;
        // 
        // exitButton
        // 
        this.exitButton.Location = new System.Drawing.Point(752, 275);
        this.exitButton.Name = "exitButton";
        this.exitButton.Size = new System.Drawing.Size(99, 25);
        this.exitButton.TabIndex = 0;
        this.exitButton.Text = "Exit";
        this.exitButton.Click += new System.EventHandler(this.cancelButton_click);
        // 
        // deletePermitButton
        // 
        this.deletePermitButton.Location = new System.Drawing.Point(218, 275);
        this.deletePermitButton.Name = "deletePermitButton";
        this.deletePermitButton.Size = new System.Drawing.Size(97, 25);
        this.deletePermitButton.TabIndex = 9;
        this.deletePermitButton.Text = "Delete permit";
        this.deletePermitButton.UseVisualStyleBackColor = true;
        this.deletePermitButton.Click += new System.EventHandler(this.deletePermitButton_Click);
        // 
        // UserInterfaceForm
        // 
        this.ClientSize = new System.Drawing.Size(886, 312);
        this.Controls.Add(this.deletePermitButton);
        this.Controls.Add(this.allPermitsDataGridView);
        this.Controls.Add(this.loadPermitButton);
        this.Controls.Add(this.SavePermitButton);
        this.Controls.Add(this.exitButton);
        this.Name = "UserInterfaceForm";
        this.Text = "Parking Permit Application";
        ((System.ComponentModel.ISupportInitialize)(this.allPermitsDataGridView)).EndInit();
        this.ResumeLayout(false);
    }

    protected void cancelButton_click(object sender, EventArgs e)
    {
        Application.Exit();
    }

    private void readPermitButton_Click(object sender, EventArgs e)
    {
        connString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Arek\Desktop\Parking Permit Application - Assignment 3\Assignment_3_OOPARDGM.accdb; 
        Persist Security Info=False;";
        dAdapter = new OleDbDataAdapter("Select * From Permits", connString);
        cBuilder = new OleDbCommandBuilder(dAdapter);

        dAdapter.Fill(dTable);

        bSource = new BindingSource();            
        bSource.DataSource = dTable;            
        allPermitsDataGridView.DataSource = bSource;
    }

    private void SavePermitButton_Click(object sender, EventArgs e)
    {
        dAdapter.Update(dTable);
        MessageBox.Show("Database successfully saved!");
    }

    private void deletePermitButton_Click(object sender, EventArgs e)
    {
        foreach (DataGridViewRow item in this.allPermitsDataGridView.SelectedRows)
        {
            allPermitsDataGridView.Rows.RemoveAt(item.Index);
        } 

    }       
}//class

看起来您的许可证表没有键字段

看起来您的许可证表没有键字段

您的意思是像自动编号许可证等?是的,它有一个。不是自动编号,而是主键。许可证ID是许可证表的主键吗?天哪!我创建了一个自动编号,但忘记将其标记为主键。万分感谢!现在我觉得很尴尬。你是说像自动编号之类的?是的,它有一个。不是自动编号,而是主键。许可证ID是许可证表的主键吗?天哪!我创建了一个自动编号,但忘记将其标记为主键。万分感谢!现在我感到尴尬。