0

我的目标是连接到一个 mdb 数据库(存储在本地),通过它并获取以下信息:

- 数据库中存在的所有表的名称

- 数据库每个表中的列名及其类型。

在开发代码时,我使用了以下 stackoverflow 问题的答案中指示的代码

需要找到DB的列的类型

我实现了在接受的答案中编写的代码,并根据我的需要对其进行了定制。这是我到目前为止所拥有的:

      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”,显然是字符串类型。

有人可以帮我弄清楚发生了什么吗?调试器是否可能误导我指出错误在该行,而真正的问题可能在其他地方?

4

3 回答 3

3

你初始化了Globals.arrColumnTypesList吗?如果该字段为空,则会出现 NullReferenceException。

于 2013-06-04T12:17:53.803 回答
2

最有可能的是,您永远不会初始化Globals.arrColumnTypesList. 在循环之前尝试这样的事情:

Globals.arrColumnTypesList = new List<string>();

或者(取决于 的类型arrColumnTypesList):

Globals.arrColumnTypesList = new string[dt.Columns.Count];
于 2013-06-04T12:17:44.937 回答
1

您可以尝试在调试模式下调试代码并打开异常 - 这将在异常发生时停止代码。一般来说,这是一个有用的功能,可以让您快速找到引发异常的位置。

为此,在 VS2012 中,转到 Debug -> Exceptions 并勾选 Common Language Runtime Exceptions 的“Thrown”框。(或按 Ctrl + D、E 获得相同的对话框)。

于 2013-06-04T12:26:27.027 回答