Слияние / репликация базы данных C # - PullRequest
3 голосов
/ 11 октября 2011

Я хочу создать решение для репликации для моего приложения на основе MS Access. У меня есть 2-4 сайта, создающих контент в базе данных, и все они в автономном режиме. Мое решение до сих пор:

Функция вызывается из меню Файл:

class main
{
private void menuItemMergeUserData_Click(object sender, EventArgs e)
        {
            OpenFileDialog openDataFileDialog = new OpenFileDialog();

            openDataFileDialog.Title = "Select UserData file to merge";
            openDataFileDialog.InitialDirectory = System.IO.Directory.GetCurrentDirectory();
            openDataFileDialog.Filter = "Database files (*.mdb)|*.mdb|All files (*.*)|*.*";
            openDataFileDialog.RestoreDirectory = true;

            if (openDataFileDialog.ShowDialog() == DialogResult.OK)
            {
                ExternalUserManager UserManager = new ExternalUserManager(openDataFileDialog.FileName, CompanyID, dbManager);
                if (UserManager.MergeUserTables())
                    MessageBox.Show("UserData merged!", "UserData");
            }
            openDataFileDialog.Dispose();
        }
}

Функция, вызываемая в классе ExternalUserManager

 public bool MergeUserTables()
        {
            bool bOk = true;

            try
            {
                //databaseManager.CallMacro(dbMyFileName);

                conUserData.Open();


                daClass.Fill(dsUserData, "Class");
                daClassUsers.Fill(dsUserData, "ClassUsers");
                daCompany.Fill(dsUserData, "Company");
                daCurriculum.Fill(dsUserData, "Curriculum");
                daCurriculumExercises.Fill(dsUserData, "CurriculumExercises");
                daCurriculumMissions.Fill(dsUserData, "CurriculumMissions");
                daCurriculumTasks.Fill(dsUserData, "CurriculumTasks");
                daUserModes.Fill(dsUserData, "UserModes");
                daUserProfile.Fill(dsUserData, "UserProfile");
                daUsers.Fill(dsUserData, "Users");
                bOk = databaseManager.MergeDataSet(dsUserData);

            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString(), "Reading UserData");
            }
            finally
            {
                conUserData.Close();
            }

            return bOk;
        }

функция, вызываемая в классе DatabaseManager

public bool MergeDataSet(DataSetUserContent dsExternalUserContent)
        {
            bool bOk = false;
            try
            {

                this.dsUserContent.MergeFailed += new MergeFailedEventHandler(OnMergeFailed);
                this.dsUserContent.Merge(dsExternalUserContent);
                if(this.dsUserContent.HasChanges())
                    bOk = SaveUsers();
             }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString(), "LogData Merge");
            }
            finally
            {
                conLogData.Close();
            }

            return bOk;
        }

Набор данных объединен так, как я хочу, однако новые строки из импортированной базы данных не были сохранены в базе данных ???

Ищите решения этой проблемы, а некоторые говорят, set AcceptChangesDuringFill = false. Пробовал, но это заставляло все строки из импортированной базы данных добавляться как новые строки в исходной базе данных.

1 Ответ

0 голосов
/ 11 ноября 2011

Если все приложения в автономном режиме, почему бы вам просто не скопировать файл MDB?

Я знаю, это грубо, но должно работать нормально.

...