#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, чтобы мы могли открывать базу данных со всех других рабочих станций в нашем (небольшом) офисе. Недостоверные результаты вызывают проблемы в моей динамической программе для преобразования файлов. Не все базы данных, которые нам нужно преобразовать, имеют одинаковые имена таблиц и / или даже с одинаковым именем, некоторые поля определены по-разному.