我试图基于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();
我做错了什么?
答案 0 :(得分:0)
由于每次都要向命令添加参数,因此不应再次重复使用命令对象。
每次要执行另一个命令时,只需调用connection.CreateCommand()
。
您可以重复使用命令,但之后您只想在每次调用时设置现有参数,而不是在每次调用时添加参数。