OLEDB - 无法在Access数据库中编辑记录

时间:2014-09-20 07:47:51

标签: c# database ms-access oledb

在我的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!我在代码中哪里出错了?我在代码中没有收到任何错误/异常。任何帮助都非常感谢。感谢。

1 个答案:

答案 0 :(得分:1)

UpdateAppointments中的这一行

aptDs.Tables[0].AcceptChanges();
应该删除

,否则该行的状态将更改为Unchanged,并且后续调用Update并未找到任何已修改的行,因此无法写入您的更改回到数据库 -

AcceptChanges的含义始终是混乱的根源。

修改行时,RowState属性变为Modified 当您调用OleDbDataAdapter.Update方法时,它会使用AddedDeletedModified等RowState搜索表中的所有行,并应用{{1}创建的OleDbCommands适合国家。

AcceptChanges适用于这些状态,将它们更改为Unchanged(并从DataTable容器中删除状态为Deleted的行)。
这样,在AcceptChanges调用之后的Update将找不到任何有资格写回数据库的行。