为什么我一直得到“对象引用没有设置为对象的实例。”?

时间:2013-06-04 12:08:58

标签: c# c#-4.0 oledb nullreferenceexception

我的目标是连接到mdb数据库(本地存储),浏览并获取以下信息:

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

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

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

need to find the type of the column of 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 {“对象引用未设置为对象的实例。”} System.Exception {System.NullReferenceException}

-Both Globals.arrColumnTypesList和Globals.arrColumnNamesList是string类型的数组。

- 在第三条指令行中,为了调试目的,我注释掉了“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”,显然是string类型。

任何人都可以帮我弄清楚发生了什么事吗?调试器是否可能误导我,表明错误在该行上,而真正的问题可能在其他地方?

3 个答案:

答案 0 :(得分:3)

您是否已初始化Globals.arrColumnTypesList?如果该字段为null,则会出现NullReferenceException。

答案 1 :(得分:2)

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

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

或(取决于arrColumnTypesList的类型):

Globals.arrColumnTypesList = new string[dt.Columns.Count];

答案 2 :(得分:1)

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

为此,在VS2012中,转到Debug - &gt;例外并勾选“公共语言运行时异常”的“Thrown”框。 (或者按Ctrl + D,E以获得相同的对话框。)