我正在编写一个用于将Access 2.0 .mdb文件移动到Access 2003 .mdb的升级程序。我们之所以使用mdb文件结构,有几个原因,因为这是位于多个客户位置的代码,而mdb允许我们利用现有代码。
主要问题:
我通过JET从file.mdb中读取表并将每个表读取到C#数据表中。然后,我进行了几次检查,并在2003 mdb db中复制了该表。我使用DataTable.PrimaryKey
函数来收集作为主键列的列,但是没有得到可靠的结果。
Access 2.0在多个表(单列)中显示了PrimaryKey,而DataTable却不是,但并非总是如此。
我已验证我确实在某些表上获得了PrimaryKey,但不是全部。
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
行中设置了一个断点,有时它会到达该断点,但并非在定义主键的所有表上都达到了。
我注意到的一件事是,在Access Ver 2.0中,一些主键的列信息显示为:required = no
,unique = no
。我不知道这是否导致JET或C#数据表取消标记主键列,或者其他是否在起作用。但是最终结果是我无法正确检测所有主键列。