1

我想弄清楚爲什麼我得到錯誤'對象引用未設置爲對象的實例。'當我的winforms代碼運行。我設置了斷點的SQL語句,並步入了代碼,並顯示爲行:使用DR = oledbCmd.ExecuteReader()ExecuteReader()對象引用未設置爲對象的實例錯誤

我仍然在學習vb.Net所以希望得到一些幫助,如何克服這個錯誤。非常感謝

DBConnection.connect() 

    sql = "SELECT * from Boxes WHERE Customer = ? AND Status = 'I'" 

    Dim cmd As New OleDb.OleDbCommand 

    cmd.Parameters.AddWithValue("@p1", cmbCustomer.Text) 

    cmd.CommandText = sql 
    cmd.Connection = oledbCnn 
    dr = cmd.ExecuteReader 

    Using dr = oledbCmd.ExecuteReader() 

     While dr.Read() 

      Dim LV As New ListViewItem 

      With LV 

       .UseItemStyleForSubItems = False 
       .Text = dr(1).ToString() 
       .SubItems.Add(dr(2).ToString()) 

      End With 
      lvSelectRequestItems.Items.Add(LV) 
     End While 

    End Using 

    cmd.Dispose() 
    dr.Close() 
    oledbCnn.Close() 

數據庫連接模塊

Imports System.Data.OleDb 

    Module DBConnection 

     Public connetionString As String = My.Settings.storageConnectionString 
     Public oledbCnn As New OleDbConnection 
     Public oledbCmd As OleDbCommand 
     Public dr As OleDbDataReader 
     Public sql As String 

     Sub connect() 

      'connetionString = My.Settings.storageConnectionString 
      oledbCnn.ConnectionString = connetionString 
      oledbCnn.Open() 

     End Sub 

    End Module 
+0

幾乎所有'NullReferenceException'的情況都是相同的。請參閱「[什麼是.NET中的NullReferenceException?](http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-in-net)」的一些提示。 –

回答

3

我看到了幾個錯誤。查看關於更改原因的評論

Dim sql As String = "SELECT * from Boxes WHERE Customer = ? AND Status = 'I'" 
'.Net uses connection pooling, such that you're better using a new connection object for each query 
'Also, a Using block will ensure the connection is closed, **even if an exception is thrown** 
' The original code would leak connections when exceptions occured, eventually locking you out of the db 
Using cn As New OleDb.OleDbConnection("Connection string here"), _ 
     cmd As New OleDb.OleDbCommand(sql, cn) 'set CommandText BEFORE adding parameters 

    'Use explicit parameter types 
    cmd.Parameters.Add("?", SqlDbType.NVarChar, 50).Value = cmbCustomer.Text 

    cn.Open() 
    Using dr As OleDb.OleDbDataReader = cmd.ExecuteReader() 
     While dr.Read() 

      Dim LV As New ListViewItem 
      With LV 
       .UseItemStyleForSubItems = False 
       .Text = dr(1).ToString() 
       .SubItems.Add(dr(2).ToString()) 
      End With 
      lvSelectRequestItems.Items.Add(LV) 

     End While 
     dr.Close() 

    End Using 
End Using 
+0

所有好東西。對不起@ user1532468,我想你應該在數據訪問之前進一步處理。它看起來並不像你知道什麼是什麼以及如何。你需要了解的基本知識,然後讓自己陷入維護夢魘之中 –

+0

@Joel當我在模塊中處理連接時,我不理解dim sql邏輯。 – user1532468

+0

@ user1532468處理模塊中的連接是不好的做法,至少是這樣。 .net使用連接池,因此您最好爲每個查詢創建一個全新的連接對象。 –

1

你沒有正確的SqlConnection綁定到SqlCommand對象。

Using connection As New SqlConnection(connectionString) 
    connection.Open() 

    Dim command As New SqlCommand(queryString, connection) 
    Dim reader As SqlDataReader = command.ExecuteReader() 
    While reader.Read() 
     Console.WriteLine("{0}", reader(0)) 
    End While 
End Using 

參見:MSDN

編輯:請求的調整清晰度,以幫助:

Using connection As New Data.SqlClient.SqlConnection 
     Dim sql As String = "SELECT * from Boxes WHERE Customer = ? AND Status = 'I'" 
     connection.Open() 
     Using command As New Data.SqlClient.SqlCommand(Sql, connection) 
      command.Parameters.AddWithValue("@p1", cmbCustomer.Text) 
      dr = command.ExecuteReader() 

      While dr.Read() 
       Dim LV As New ListViewItem 
       With LV 
        .UseItemStyleForSubItems = False 
        MediaTypeNames.Text = dr(1).ToString() 
        .SubItems.Add(dr(2).ToString()) 

       End With 
       lvSelectRequestItems.Items.Add(LV) 
      End While 
     End Using 
    End Using 

您的代碼應東西這樣。

+0

Frazell,你能否通過修改我的代碼來幫助我,這樣我就可以完全明白我出錯的地方了。謝謝 – user1532468

+0

@ user1532468我添加了一些澄清,應該使它很清楚。 –

+0

它不一定需要是sqlconnection。他可能會使用SQL Server以外的東西。@ user1532468如果您使用的是sql server,那麼使用sql [x]類而不是oledb –

1

你在這裏遇到了相當多的潛在問題。

1-您正在使用您的dr變量兩次。一次在使用之前,這可能會導致你的錯誤。然後再次使用,這看起來不正確,因爲它不是用於執行讀取器的cmd變量。所以改變你的這部分代碼:

cmd.CommandText = sql 
cmd.Connection = oledbCnn 
dr = cmd.ExecuteReader 

Using dr = oledbCmd.ExecuteReader() 

這樣:

cmd.CommandText = sql 
cmd.Connection = oledbCnn 

Using dr = cmd.ExecuteReader() 

2,你是否oledbCnn已經沒有開通沒有顯示。我假設你的DBConnection.connect()函數正在這樣做,而olebCnn是一個函數設置和打開的變量。

3 - 我不確定查詢字符串中的問號是否有效。即使這樣做,您應該用參數名稱替換它。所以您的查詢字符串應該是:

sql = "SELECT * from Boxes WHERE Customer = @p1 AND Status = 'I'" 

最後你應該顯示的子(或功能),這是所以我們可以得到一個完整的畫面中的所有代碼。示例博士必須在使用之前聲明否則你會得到一個構建錯誤。

+0

hubson我做了改動,仍然是同樣的錯誤。謝謝 – user1532468

+0

那麼它很可能還沒有設置oledbCnn變量。你必須聲明它然後調用open函數。或者你可能已經有一個連接變量可以在其他地方使用。很難說,因爲您還沒有涉及代碼 –

+0

。對所使用的相關變量進行監視,以便您可以看到它們的值。所以對於這種情況下添加觀看博士,CMD,SQL和OledbCnn –

相關問題