我的目标是连接到一个 mdb 数据库(存储在本地),通过它并获取以下信息:
- 数据库中存在的所有表的名称
- 数据库每个表中的列名及其类型。
在开发代码时,我使用了以下 stackoverflow 问题的答案中指示的代码
我实现了在接受的答案中编写的代码,并根据我的需要对其进行了定制。这是我到目前为止所拥有的:
DataSet dtImportedTables = new DataSet();
Globals.strSQLQuery = "SELECT * FROM {0}";
//try
//{
Globals.conConnection = new OleDbConnection(Globals.strConnection);
Globals.conConnection.Open();
foreach (DataRow row in Globals.tblSchemaTable.Rows)
{
DataTable dt = new DataTable();
OleDbCommand command = new OleDbCommand(String.Format(Globals.strSQLQuery, row["TABLE_NAME"] as String), Globals.conConnection);
dt.Load(command.ExecuteReader(CommandBehavior.SchemaOnly));
dtImportedTables.Tables.Add(dt);
}
Globals.conConnection.Close();
string temp="";
int k;
foreach (DataTable dt in dtImportedTables.Tables)
{
k = 0;
foreach (DataColumn dc in dt.Columns)
{
Globals.arrColumnNamesList[k] = dc.ColumnName;
Globals.arrColumnTypesList[k] = dc.DataType.ToString();
temp += k+ ") "+Globals.arrColumnNamesList[k] + Environment.NewLine + Globals.arrColumnTypesList[k] + Environment.NewLine;
k++;
}
}
请注意以下事项:
-我正在使用 Visual Studio 2012,这是一个 Windows 窗体应用程序,用 C# 编程
- 连接工作正常(至少根据调试),并且有问题的数据库仅由一个包含几列的表组成。
- 错误的完整调试描述是:$exception{"Object reference not set to an instance of an object."} System.Exception {System.NullReferenceException}
- Globals.arrColumnTypesList 和 Globals.arrColumnNamesList 都是字符串类型的数组。
- 在第三条指令行上,我出于调试目的注释掉了“try”部分(即,如果保持原样,由于我正在询问的错误,程序将不会执行整个部分,因此不会让调试器警告我错误)。
-我必须从上面提到的 stackoverflow 问题中找到的原始版本修改两个 foreach 语句。正如它所写的那样,编译器会给我一个错误。
- 问题出现在这里:
Globals.arrColumnTypesList[k] = dc.DataType.ToString();
在查看有关此异常的其他问题时,我发现如果表达式返回 NULL 值通常会抛出它(在这种情况下,据我了解,这意味着 dc.DataType 为 NULL)。但是在VisualStudio的调试工具中,DataType根本不是NULL,它实际上包含了值{"System.String"}。我认为 ToString() 方法可能是导致这种奇怪行为的原因,因此我将表达式更改为以下内容:
Globals.arrColumnTypesList[k] = dc.DataType.Name;
它给了我同样的错误,这次 dc.DataType.Name 的值为“String”,显然是字符串类型。
有人可以帮我弄清楚发生了什么吗?调试器是否可能误导我指出错误在该行,而真正的问题可能在其他地方?