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");
确定更改连接字符串时遇到问题和不同行为的原因如下:
- 磁盘上有两个数据库,您查找的是错误的数据库
- 您以错误的方式访问数据
现在我评论说您的数据访问不正确:
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,这就是新数据的获取方式