C#Access数据库不';t在插入后更新数据

C#Access数据库不';t在插入后更新数据,c#,C#,我正在做一个学校项目,遇到了一个问题。当我从数据库中插入/更新/删除数据时,数据在我重新启动应用程序之前不会显示。我必须关闭应用程序,然后再次打开它才能显示更改 当我更改OleDbConnection字符串时(当我更改源时),数据会更新,但它仅在我关闭应用程序之前显示,当我关闭应用程序时,我会丢失所有新数据。数据库中的数据显示在dataGridView中。当我为dataGridView选择数据源时,代码行将自动写入form load event中,使用该代码,当源更改为不保存数据的文件时,我可以

我正在做一个学校项目,遇到了一个问题。当我从数据库中插入/更新/删除数据时,数据在我重新启动应用程序之前不会显示。我必须关闭应用程序,然后再次打开它才能显示更改

当我更改
OleDbConnection
字符串时(当我更改源时),数据会更新,但它仅在我关闭应用程序之前显示,当我关闭应用程序时,我会丢失所有新数据。数据库中的数据显示在
dataGridView
中。当我为
dataGridView
选择数据源时,代码行将自动写入form load event中,使用该代码,当源更改为不保存数据的文件时,我可以更新数据

OleDbConnection konekcija = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Hotel.mdb;Persist Security Info=False");
我想知道是否有其他方法可以在添加新数据后自动刷新(或使用按钮)
dataGridView
。我使用的是VS C#2008快速版,因为这是我们在学校使用的版本

OleDbConnection konekcija = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:/Users/Pupo/Desktop/Hotel/Hotel/Hotel/Hotel.mdb;Persist Security Info=False");
以下是“插入”按钮的代码:

 private void buttonInsert_Click(object sender, EventArgs e)
    {

        konekcija.Open();
        OleDbCommand komanda = konekcija.CreateCommand();
        komanda.CommandType = CommandType.Text;
        komanda.CommandText = ("Insert into Sobe(Broj_sobe,Tip_sobe,Telefon,Stanje)values('"
            + textBoxBrSobe.Text + "','" + textBox2.Text +"','" + textBoxTelefon.Text + "','" + textBox1.Text + "')");
        komanda.ExecuteNonQuery();
        
        konekcija.Close();
        MessageBox.Show("Uspjeli ste");
//this is written automatically in form load event
        this.sobeTableAdapter1.Update(this.hotelDataSet1.Sobe);
    }
这是连接字符串,这是我在学校的教学方式

OleDbConnection konekcija = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:/Users/Pupo/Desktop/Hotel/Hotel/Hotel/Hotel.mdb;Persist Security Info=False");
当我将连接字符串更改为转到bin/debug文件夹时,它会自动更新,但不会保存数据

OleDbConnection konekcija = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Hotel.mdb;Persist Security Info=False");

确定更改连接字符串时遇到问题和不同行为的原因如下:

  • 磁盘上有两个数据库,您查找的是错误的数据库
  • 您以错误的方式访问数据
这两个你都打到了。首先,我来解释第一个

当您将access数据库添加到项目中时(无论您如何操作,都有几种方法),可能会出现此对话框(或类似对话框-这是vs 2019)

它很长,很无聊,告诉人们很多他们可能不懂的东西,所以他们只是点击“是”,然后忘记它。稍后,他们在试图保存数据时会非常困惑

此框的基本意思是“我将把db复制到您的项目文件夹中,但请记住,每次按play键时,它都会再次复制到BIN文件夹中,您正在运行的程序将修改BIN文件夹中的数据库,而不是项目文件夹中的db,也不是桌面(或任何位置)中的db”

稍后,开发人员运行程序,保存一些数据,在Access中查找,但没有找到它。或者他们再次运行该程序,并想知道“我刚才保存的数据到哪里去了”

“每次运行程序时,项目文件夹中的数据库都会复制到bin文件夹中”

这意味着每次在VisualStudio中构建项目时,程序保存数据的数据库都将被删除和替换。它不会影响实时应用程序(实时应用程序不会在每次运行时自行构建),只会影响在VS中运行的应用程序

如果你在BIN文件夹以外的任何数据库中查找,你都找不到数据,因为你找错了

我建议您在解决方案资源管理器中找到您的数据库,右键单击它,选择“属性”,并将“复制到输出”更改为“如果更新,则复制”。这种方式VS只会在您对项目文件夹中的数据库进行更改(即添加新表)时替换bin文件夹中的数据库-这更像您通常想要做的事情


现在我评论说您的数据访问不正确:

private void buttonInsert_Click(object sender, EventArgs e)
{

    konekcija.Open();
    OleDbCommand komanda = konekcija.CreateCommand();
    komanda.CommandType = CommandType.Text;
    komanda.CommandText = ("Insert into Sobe(Broj_sobe,Tip_sobe,Telefon,Stanje)values('"
        + textBoxBrSobe.Text + "','" + textBox2.Text +"','" + textBoxTelefon.Text + "','" + textBox1.Text + "')");
    komanda.ExecuteNonQuery();
    
    konekcija.Close();
    MessageBox.Show("Uspjeli ste");
    //this is written automatically in form load event
    this.sobeTableAdapter1.Update(this.hotelDataSet1.Sobe);
}
根本不需要在应用程序中创建OLEDB命令。VS在数据集(HotelDataSet)中为您编写所有代码。TableAdapter包含一个OLEDB命令;事实上有好几个。TableAdapter是一种将数据从数据库下载到数据集中的设备,它还负责在发生更改(新记录、更改记录和删除记录)时将数据保存回数据库

所有这些神奇的事情都发生在
tableadapter.Update(…)
-Update不仅仅运行更新。它还运行INSERT和DELETE—当您将数据下载到数据集中时,它最终存储在datarow中的datatable中。这与数据库非常相似。DataRows跟踪您的用户所做的事情-如果有新行生成并添加到datatable,则其RowState为added。如果更改现有行中的数据,则其状态为“已修改”。如果从数据表中删除该行,它将被标记为已删除。调用
tableadapter.Update(数据表)
将执行不同的SQL INSERT/Update/DELETE,以分别保存您对添加的/修改的/删除的行所做的任何操作。保存后,行将变为未更改状态。如果您再次编辑它,它将再次被修改,因此当您调用Update时,它将再次被保存

因此,如果要在数据库中插入一行,应该将其添加到datatable中,然后更新以保存它。如果datatable正在由DataGridView查看,那么网格将自动看到更改,并在添加时显示更改

可能是这样的:

//put this in a button click
hotelDataSet1.Sobe.AddSobeRow(textBoxBrSobe.Text, textBox2.Text, textBoxTelefon.Text, textBox1.Text);
现在,该行将显示在datagridview中它还不在数据库中它只在本地数据表中,就像缓存/临时数据存储在客户端一样。您必须保存它以使其进入数据库。这将保存数据:

this.sobeTableAdapter1.Update(this.hotelDataSet1.Sobe);
您声称是在表单加载中写入的;事实并非如此。表单加载中的内容是调用填充,而不是更新。填充是为了装载。更新用于保存

将绑定网格添加到窗体时,windows窗体使用数据集的默认行为是在窗体加载时调用Fill,从数据库下载所有数据,以便查看。它不会在表单加载中调用update,因为表单是新的;没有什么需要更新的。任何时候你想从你调用的数据库下载数据

这就是为什么当您将连接字符串更改为指向某个不在BIN文件夹中的其他DB时,会遇到第二个问题,然后使用OleDbCommand将数据插入到DB中-它仅在重新加载程序时出现,因为表单加载调用Fill,这就是新数据的获取方式