Объединение файлов множественного доступа с одинаковой структурой и первичным ключом - PullRequest
0 голосов
/ 24 марта 2020

Я осмотрелся и нашел много ответов на это для других типов БД, но ничего для доступа.

Я объединяю несколько файлов доступа в один файл прямо сейчас. Все работало нормально, пока я не понял на CREATE TABLE, что я забыл определить первичный ключ и создать кучу дублированных записей при слиянии. Первичный ключ в этих файлах - GUID. Так как бы я теперь обработал дубликаты?

Вот текущее создание:

CREATE TABLE [PRODUCE] ([PRODUCE_ID] VARCHAR(255) NOT NULL PRIMARY KEY, [PRODUCE_TYPE] VARCHAR(255) NOT NULL, [PRODUCE_LINK] DOUBLE NOT NULL)

А вот текущее значение SELECT и INSERT:

SELECT PRODUCE_ID, PRODUCE_TYPE, PRODUCE_LINK FROM PRODUCE

INSERT INTO [PRODUCE] ([PRODUCE_ID], [PRODUCE_TYPE], [PRODUCE_LINK]) VALUES(@PRODUCE_ID, @PRODUCE_TYPE, @PRODUCE_LINK)

Ошибка В настоящее время я делаю так: «Запрошенные вами изменения в таблице не увенчались успехом, поскольку они приводят к дублированию значений в индексе, первичном ключе или отношении. Измените данные в поле или полях, которые содержат повторяющиеся данные, удалите индексировать или переопределить индекс, чтобы разрешить повторяющиеся записи, и повторите попытку. "

Редактировать: добавлен весь раздел кода, где это делается.

                    OleDbConnection produceSource = new OleDbConnection(produceSourceString);
                    OleDbConnection produceDestination = new OleDbConnection(produceFinalString);

                    produceDestination.Open();

                    OleDbCommand cmdBSSource = produceSource.CreateCommand();
                    cmdBSSource.Connection = produceSource;
                    cmdBSSource.CommandText = "SELECT PRODUCE_ID, PRODUCE_TYPE, PRODUCE_LINK FROM PRODUCE";

                    OleDbCommand cmdBSDestination = produceDestination.CreateCommand();
                    cmdBSDestination.Connection = produceDestination;
                    cmdBSDestination.CommandText = @"INSERT INTO [PRODUCE] ([PRODUCE_ID], [PRODUCE_TYPE], [PRODUCE_LINK]) " +
                                                   @"VALUES(@PRODUCE_ID, @PRODUCE_TYPE, @PRODUCE_LINK)";

                    OleDbParameter param1 = new OleDbParameter("@PRODUCE_ID", OleDbType.VarChar);
                    cmdBSDestination.Parameters.Add(param1);
                    OleDbParameter param2 = new OleDbParameter("@PRODUCE_TYPE", OleDbType.VarChar);
                    cmdBSDestination.Parameters.Add(param2);
                    OleDbParameter param3 = new OleDbParameter("@PRODUCE_LINK", OleDbType.Double);
                    cmdBSDestination.Parameters.Add(param3);

                    produceSource.Open();

                    OleDbDataReader readerBS = cmdBSSource.ExecuteReader();

                    while (readerBS.Read())
                    {
                        param1.Value = readerBS[0].ToString();
                        param2.Value = readerBS[1].ToString();
                        param3.Value = readerBS[2].ToString();

                        cmdBSDestination.ExecuteNonQuery();
                    }
                    produceDestination.Close();
                    produceSource.Close();
...