C#MS Access数据库 - 发送第二个UPDATE命令显示错误

时间:2013-12-28 14:23:46

标签: c# ms-access

我试图基于C#和Access数据库为我的程序创建UPDATE命令。它的工作方式我想要它,但当我尝试第二次更新另一个或相同的记录时VS2013显示错误。

  

InvalidComObjectException未处理。   已与基础RCW分离的COM对象不能   使用

这就是我的程序的样子:

FormA - 使用表格“Grafik”的DataGridView1和打开 FormB 的按钮的主窗口

FormB - 使用表Employyes的DataGridView2和按钮 FormC

的第二个表单

FormC - 使用TextBox'es,ComboBox'es和Buttons(不直接在DataGridView上)直接添加,删除和更新记录到数据库“Kategorie”的表单

UPDATE过程使用ComboBox( comboBoxWybierzKategorie )从数据库“Kategorie”中选择“category”进行更新,textBox( textBoxEdytujKategorie )设置所选“Kategoria”的新名称和按钮接受程序。

Broker.cs

        public void Update_Kategorie(Kategorie oldKategoria, Kategorie newKategoria)
    {
        try
        {

            command.CommandText = "UPDATE Kategorie SET Kategoria = @kat WHERE IDKategorii= @old";
            //command.CommandType = CommandType.Text;
            command.Parameters.AddWithValue("@kat", newKategoria.Kategoria);
            command.Parameters.AddWithValue("@old", oldKategoria.IDKategorii);
            connection.Open();
            //command.ExecuteNonQuery();
            int cmd = command.ExecuteNonQuery();

            //connection.Close();
            if (cmd > 0)
            {
                MessageBox.Show("Kategoria zaktualizowana pomyślnie");
                //connection.Close();


            }
            else
            {
                MessageBox.Show("Wystąpił błąd podczas aktualizacji kategorii.",
                    "Dodawanie kategorii",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Exclamation,
                    MessageBoxDefaultButton.Button1);
            }

        }
        catch (OleDbException ex)
        {

FormC.cs

private void buttonEdytujKategorie_Click(object sender, EventArgs e)
    {
        Kategorie oldKategoria = new Kategorie();
        Kategorie newKategoria = new Kategorie();
        oldKategoria = comboBoxWybierzKategorie.SelectedItem as Kategorie;
        newKategoria.Kategoria = Convert.ToString(textBoxEdytujKategorie.Text);
        b.Update_Kategorie(oldKategoria, newKategoria);

        comboBoxWybierzKategorie.DataSource = b.FillComboBox_Kategorie(); //wypełnij comboBoxWybierzKategorie
        textBoxEdytujKategorie.Text = String.Empty; //wyczyść textBoxEdytujKategorie
        //this.Close();
        //this.Controls.Clear();
        //this.InitializeComponent();

我知道代码搞砸了,对不起。更有趣的是当我关闭FormC并使用Button重新打开它时,更新功能正常工作,除非我想再次使用它。

VS2013选择此行作为错误原因:

int cmd = command.ExecuteNonQuery();

连接数据库:

OleDbConnection connection;
    OleDbCommand command;

private void ConnectTo()
    {
        //inside//connection = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=bc3e-ps.accdb");
        /*outside*/
        connection = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\bc3e-ps.accdb");
        command = connection.CreateCommand();

我做错了什么?

1 个答案:

答案 0 :(得分:0)

由于每次都要向命令添加参数,因此不应再次重复使用命令对象。

每次要执行另一个命令时,只需调用connection.CreateCommand()

您可以重复使用命令,但之后您只想在每次调用时设置现有参数,而不是在每次调用时添加参数。