2013-06-04 15 views
0

我的目標是要連接到一個MDB數據庫(存儲在本地),通過它,並獲得以下信息:任何人都可以告訴我爲什麼我總是收到「對象引用未設置爲對象的實例」。運行此代碼時?

-The所有的表存在於數據庫中

列-The指名道姓以及它們在數據庫的每個表中的類型。

在開發我以前在答覆中指出的代碼下面的計算器問題

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++; 

      } 
     } 

注意以下幾點:

-I正在使用Visual Studio 2012,這是一個Windows窗體應用程序,在C#編程

-The連接工作正常(至少根據調試情況),並且所討論的數據庫僅由一個包含多列的表組成。

錯誤-The完整的調試描述是: $ {例外 「對象引用不設置到對象的實例。」} System.Exception的{} System.NullReferenceException

導向軸Globals.arrColumnTypesList和Globals.arrColumnNamesList是字符串類型的數組。

- 在第三條指令行中,我爲調試目的註釋了「try」部分(即,如果保持不變,程序將因爲我詢問的錯誤而無法執行整個部分,因此不會讓調試器發出警告我的錯誤)。

- 我不得不從上面提到的stackoverflow問題中找到的原始版本修改這兩個foreach語句。正如它寫的那樣,編譯器會給我一個錯誤。發生

-The問題就在這裏:

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有一個值的「字符串」,顯然是字符串類型。

有人能幫我弄清楚發生了什麼事嗎?調試器可能誤導我說錯誤在那一行,而真正的問題可能在其他地方?

+1

您確定Globals.arrColumnNamesList不爲空嗎? –

+0

是否將Globals.arrColumnTypesList [k]指定爲新數組? – anthr

+0

你在「調試」模式而不是「發佈」下編譯/運行了它嗎?有時,在發佈模式下進行調試會導致出現異常行數/中斷。 –

回答

2

很可能,你永遠不會初始化Globals.arrColumnTypesList。嘗試這樣的事情在循環之前:

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

或(視arrColumnTypesList類型):

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

好的你是對的,我沒有初始化數組,名稱也是誤導,他們是常規數組而不是實際列表。我決定爲程序的這一位實現列表,所以我現在編輯了代碼,它工作得很好:'Globals.arrColumnTypesList = new List ();'並且在該嵌套的foreach循環中Globals.arrColumnTypesList.Add(dc.DataType的ToString());' – lmolino

2

你初始化Globals.arrColumnTypesList?如果該字段爲空,則會出現NullReferenceException。

1

您可以嘗試在調試模式下調試代碼並開啓異常 - 這將在異常發生時停止代碼。通常這是一個有用的功能,可以讓您快速找到引發異常的位置。

要做到這一點,在VS2012中,轉到調試 - >例外,並勾選公共語言運行時例外的'投擲'框。 (或按Ctrl + D,E獲得相同的對話框)。

相關問題