возвращена недостоверная информация

#c# #ms-access #datatable #primary-key

#c# #ms-access #datatable #первичный ключ

Вопрос:

Я пишу программу обновления для переноса файлов Access 2.0 .mdb в Access 2003 .mdb. Мы придерживаемся файловой структуры mdb по нескольким причинам, поскольку этот код находится в нескольких местах расположения клиентов, а mdb позволяет нам использовать существующий код.

Основная проблема:

Я использую JET для чтения таблиц из file.mdb и считываю каждую таблицу в C # datatable. Затем я выполняю несколько проверок и дублирую таблицу в базе данных mdb 2003. Я использую DataTable.PrimaryKey функцию для сбора столбцов, которые являются столбцами первичного ключа, но я не получаю надежных результатов.

Access 2.0 показывает первичный ключ в нескольких таблицах (один столбец), где DataTable этого не делает, но не всегда.

Я подтвердил, что я получаю первичные ключи в некоторых таблицах, просто не во всех.

 DataColumn[] dcPrimaryKeyCols = OrgTbl.PrimaryKey;
            //Read the Ordinal so we can order the columns correctly
            for (int m = 0; m < NumCols; m  )
            {
                ColumnOrder[m] = OrgTbl.Columns[m].Ordinal;
                if (ColumnOrder[m] != m)
                    MessageBox.Show("In table "   nm  "out of order ordinal on column: "   OrgTbl.Columns[m].ColumnName);
            }
            lblStatus.Text = "Creating Table";
            pbTableProgress.Value = 0;
            pbTableProgress.Maximum = NumCols;
            for (int col = 0; col < NumCols;col   )
            {
                pbTableProgress.Value = col;
                Application.DoEvents();
                sColNm=OrgTbl.Columns[col].ColumnName.Trim();
                bPrimaryKey = false;
                //determine if this column is part of a primary key group
                for (int k = 0; k < dcPrimaryKeyCols.Length;k   )
                {
                    if (dcPrimaryKeyCols[k].ColumnName.Trim().Equals(sColNm))
                    {
                        bPrimaryKey = true;
                        break;
                    }
                }
  

Я установил точку останова в bPrimaryKey = true строке, и иногда она туда попадает, но не во всех таблицах, где определен primarykey.

Одна вещь, которую я отметил, в Access версии 2.0 отображается информация о столбцах для некоторых первичных ключей: required = no , unique = no . Я не знаю, заставляет ли это JET или C # datatable снимать пометку с столбца primarykey или здесь действуют другие вещи. Но конечным результатом является то, что я не могу правильно определить ВСЕ столбцы primarykey.

Комментарии:

1. Откуда берется numCols? Всегда ли это одно и то же число для каждой таблицы?

2. Я не показал полную функцию, numCols = OrgTbl. Столбцы. Количество;

3. Hum, unique = no и required = no могут быть возможны ТОЛЬКО в том случае, если PK является PK с несколькими ключами. Я думал, что они всегда требовались ОБА, но, похоже, это не так. Я бы открыл эту таблицу в Access и посмотрел, что показывает конструктор таблиц. Access 2.0 вышел в 1994 году, то есть 25 лет назад. Итак, мы говорим о пароходах, телеграфе и днях эпохи конных экипажей. Если у вас есть Access 2003, то вы могли бы попробовать открыть таблицу в режиме конструктора (и ваши параметры «требуемый общий доступ» / «уникальные настройки» предполагают, что вы это уже сделали). Используете ли вы поставщиков oleDB или поставщика ODBC? (вы могли бы попробовать оба варианта).

4. Альберт, значения PK, unique и required были взяты из конструкторского представления программы Access 2.0. Одна из наших проблем заключается в том, что у нас есть только один компьютер на базе XP, который имеет код Access 2.0, и мы пытаемся обновить mdb-файлы до формата 2003, чтобы мы могли открывать базу данных со всех других рабочих станций в нашем (небольшом) офисе. Недостоверные результаты вызывают проблемы в моей динамической программе для преобразования файлов. Не все базы данных, которые нам нужно преобразовать, имеют одинаковые имена таблиц и / или даже с одинаковым именем, некоторые поля определены по-разному.