Я хочу создать решение для репликации для моего приложения на основе 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. Пробовал, но это заставляло все строки из импортированной базы данных добавляться как новые строки в исходной базе данных.