在我的WinForms应用程序中,我正在连接到Access(mdb)数据库。我在数据库中有2个表。 MDB未添加到项目中。它只是在应用程序的exe文件中的文件夹中存在。
从应用程序中,我正在尝试添加/编辑数据库的记录。我可以连接到数据库,将记录添加到数据库,但发现编辑记录有困难。在应用程序运行时,我发现数据库已使用已编辑的记录进行更新,但在重新连接到数据库时,编辑的记录不存在,即根本不编辑记录。数据库只是暂时更新了编辑过的记录。没有永久更新。这是我的代码: -
public static OleDbConnection SetupConnection()
{
mainCon = new OleDbConnection();
mainCon.ConnectionString = "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source = ServiceStn.mdb;";
try
{
mainCon.Open();
// Fill Data DS
FillAppointmentDS();
........
// Fill AppointmentDS with Appointment Table data
private static void FillAppointmentDs()
{
string todayDt = DateTime.Now.ToString("dd/MM/yyyy");
aptDs = new DataSet();
aptDa = new OleDbDataAdapter("Select * from Appointment where appointDate = #" + todayDt + "#", mainCon);
OleDbCommandBuilder aptCmdBuilder = new OleDbCommandBuilder(aptDa);
aptDa.Fill(aptDs, "Appointment");
aptDa.FillSchema(aptDs, SchemaType.Source, "Appointment");
return;
}
// Add new Appointment to the DB
public static bool SaveAppointment(Models.Appointment apt)
{
DataRow dr = null;
dr = aptDs.Tables[0].NewRow();
dr["custID"] = apt.CustomerId;
dr["appointDate"] = apt.AppointmentDate.Date; // "17/9/2014";
dr["appointTime"] = apt.AppointmentTime.TimeOfDay.ToString();
dr["companyName"] = apt.AC_CompanyName;
dr["model"] = apt.AC_Model;
dr["problem"] = apt.AC_Problem;
aptDs.Tables[0].Rows.Add(dr);
int updatedRows = aptDa.Update(aptDs, "Appointment");
Console.WriteLine("Updated Rows - " + updatedRows);
dr = null;
// Add Appointment to the AppointmentList
appoints.Add(apt);
if (updatedRows > 0)
return true;
else
return false;
}
// Update an existing Appointment in the DB
public static bool UpdateAppointment(Models.Appointment apt)
{
DataRow dr = null;
string filter = "aptID=" + apt.AppointmentId;
dr = aptDs.Tables[0].Select(filter)[0];
dr["appointDate"] = apt.AppointmentDate.Date;
dr["appointTime"] = apt.AppointmentTime.TimeOfDay.ToString();
dr["companyName"] = apt.AC_CompanyName;
dr["model"] = apt.AC_Model;
dr["problem"] = apt.AC_Problem;
// OleDbCommandBuilder aptCmdBuilder = new OleDbCommandBuilder(aptDa);
// dr.AcceptChanges();
aptDs.Tables[0].AcceptChanges();
// dr.SetModified();
int updatedRows = aptDa.Update(aptDs.Tables[0]); //(aptDs, "Appointment");
//int updatedRows = aptDa.Update(aptDs, "Appointment");
Console.WriteLine("Updated Rows - " + updatedRows);
dr = null;
if (updatedRows > 0)
return true;
else
return false;
}
SaveAppointment()工作顺利,但UpdateAppointment()在重新将应用程序连接到数据库时不显示更新的DB记录。
任何人都可以帮助我知道为什么我无法永久编辑记录到DB!我在代码中哪里出错了?我在代码中没有收到任何错误/异常。任何帮助都非常感谢。感谢。
答案 0 :(得分:1)
UpdateAppointments中的这一行
aptDs.Tables[0].AcceptChanges();
应该删除,否则该行的状态将更改为Unchanged
,并且后续调用Update
并未找到任何已修改的行,因此无法写入您的更改回到数据库 -
AcceptChanges
的含义始终是混乱的根源。
修改行时,RowState属性变为Modified
当您调用OleDbDataAdapter.Update
方法时,它会使用Added
,Deleted
或Modified
等RowState搜索表中的所有行,并应用{{1}创建的OleDbCommands适合国家。
AcceptChanges适用于这些状态,将它们更改为Unchanged(并从DataTable容器中删除状态为Deleted的行)。
这样,在AcceptChanges调用之后的Update将找不到任何有资格写回数据库的行。