2013-03-12 59 views
3

我有一個VB.NET程序,可以從10個不同的數據庫構建多個數據集。VB.NET System.NullReferenceException

我得到這個異常:

System.NullReferenceException: Object referenced not set to an 
instance of an object: 

發生在以下行此錯誤:

Me.OverTableAdapter.Adapter.SelectCommand.CommandTimeout = 60000 
Me.OverTableAdapter.Fill(Me.Dataset.Over, TodayDt, TodayEnd) 

是什麼異常是什麼意思?

+0

您應該附加一個調試器,並查看Me.OverTableAdapter.Adapter.SelectCommand中的哪些對象爲空。 – Peter 2013-03-12 14:25:56

+0

所以這是一個強類型數據集,'OverTableAdapter'是一個自動生成的'TableAdapter'? – 2013-03-12 14:26:43

回答

5

那麼,如果它的失敗在這條線:

Me.OverTableAdapter.Adapter.SelectCommand.CommandTimeout = 60000 

然後:

  • Me.OverTableAdapterNothing
  • Me.OverTableAdapter.AdapterNothing
  • Me.OverTableAdapter.SelectCommandNothing

(你已經證明我們的第二行是無關緊要的,因爲你沒有得到那麼遠。)

我們不能告訴根據您告訴我們什麼,但你應該能夠找到無論是在調試器中還是通過添加診斷日誌記錄。

一旦你制定出來爲什麼這是失敗的,修復它應該很容易 - 這幾乎肯定只是一個正確初始化的問題。將此適配器的初始化與其他的初始化進行比較。

+1

Joooonnnnnn ..... :) – 2013-03-12 14:26:07

+0

它沒有選擇任何東西,它只是告訴程序增加這個特定適配器填充的超時時間......它在程序的早些時候被分配了連接字符串,但正如我前面所說的,它是相同的到其他10 ...我在每個部分分配不同的數據庫連接字符串,然後循環並使用相同的代碼收集結果。 – Shmewnix 2013-03-12 14:43:40

+0

@Shmewnix:我沒有說它正在選擇任何東西。我說其中一個表達式是'Nothing'。我強烈懷疑它*與其他10不相同。我強烈懷疑你在某處存在拼寫錯誤,但我們不能說出你只向我們展示了一小段代碼。正如我所說的,您應該使用調試器並確定哪些表達式爲空,以及爲什麼。 – 2013-03-12 14:52:10

2

這個例外的原因是SelectCommand將從TableAdapter.Fill初始化,而不是之前。所以當你在NullReferenceException之前嘗試改變Timeout

您可以通過在不同於designer.vb/designer.cs的單獨文件中創建部分類來擴展TableAdapter

Namespace DataSet1TableAdapters 

    Partial Public Class OverTableAdapter 
     Public Property CommandTimeout As System.Int32 
      Get 
       If Me.CommandCollection Is Nothing OrElse Me.CommandCollection.Length = 0 Then 
        Return -1 
       Else 
        Return Me.CommandCollection(0).CommandTimeout 
       End If 
      End Get 
      Set(value As System.Int32) 
       If Not Me.CommandCollection Is Nothing Then 
        For Each cmd In Me.CommandCollection 
         cmd.CommandTimeout = value 
        Next 
       End If 
      End Set 
     End Property 
    End Class 

End Namespace 

現在,您可以在創建適配器實例後使用此屬性。

+0

這是不正確的。這是第四個select命令,接下來是填充這個特定的數據庫。如果是其他方式......它超時。 (這也適用於程序中的所有其他數據庫)。 – Shmewnix 2013-03-12 14:47:45

+0

@Shmewnix:什麼意思_「這是第四個SelectCommand」_?一個'TableAdapter'只有一個'SelectCommand',它是從選擇行的方法初始化的。這可以是'Fill','GetData'或返回行的自定義查詢。然而,其中一個必須被執行,否則'SelectCommand'(它是'protected' btw)是'Nothing/null'。但即使它不爲null,它也會在適當命令的每個方法調用中被覆蓋。這就是爲什麼我上面的屬性設置了所有命令的'CommandTimeouts'。 – 2013-03-12 14:54:36

+0

你是對的。您的信息很有幫助。 – Shmewnix 2013-03-12 15:00:48

相關問題