2014-05-05 48 views
0

我正在創建登錄表單,並且每次嘗試登錄時(無論是否有正確的用戶),都會給我提供相同的錯誤。VB2010&MSACCESS |對象引用未設置爲對象的實例

「對象引用不設置到對象的實例」

下面的代碼:

Public Class login 
    Dim conn As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:\Users\Fausto\Documents\GitHub\CRE\cre.accdb;") 
    Dim sql As String = "SELECT USERID FROM USERS WHERE [email protected]_userid AND [email protected]_passw;" 
    Dim cmd As New OleDb.OleDbCommand(sql, conn) 
    Dim da As New OleDb.OleDbDataAdapter 

    Private Sub login_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 

    End Sub 

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
     'I figured how to make comments in VB! Yeey 
     'Temporarely redirecting to menuForm 
     With cmd 
      .Parameters.AddWithValue("p_userid", username.Text) 
      .Parameters.AddWithValue("p_passw", password.Text) 
     End With 
     Try 
      conn.Open() 
      Dim usr As String = cmd.ExecuteScalar.ToString 
      If Not (IsDBNull(usr)) AndAlso usr = username.Text Then 
       Me.DialogResult = Windows.Forms.DialogResult.OK 
      Else 
       Me.DialogResult = Windows.Forms.DialogResult.Cancel 
      End If 
     Catch ex As Exception 
      MsgBox("Could not connect to DB hahahaha" & Environment.NewLine & "Error message: " & ex.Message) 
      Me.DialogResult = Windows.Forms.DialogResult.Cancel 
     Finally 
      conn.Close() 
      Me.Close() 
     End Try 
    End Sub 

    Private Sub closeBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles closeBtn.Click 
     End 
    End Sub 

    Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click 
     credits.Show() 
    End Sub 
End Class 

我使用Visual Basic速成和Microsoft Access 2010, 感謝:d

+0

註釋掉'Catch'語句,以便您可以看到錯誤實際發生的行。 –

+0

我已經評論過它仍然給我同樣的錯誤。 – FrostVolkoff

+2

我知道它仍然會給出錯誤 - 但是,它現在應該斷開發生異常的線路。那麼......它是什麼? –

回答

0

我看到了幾個問題,但我認爲問題中提到的問題在這裏:

Dim conn As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:\Users\Fausto\Documents\GitHub\CRE\cre.accdb;") 
Dim sql As String = "SELECT USERID FROM USERS WHERE [email protected]_userid AND [email protected]_passw;" 
Dim cmd As New OleDb.OleDbCommand(sql, conn) 

問題是這些變量是類級別的,在類構造函數之前初始化,並且變量初始化的順序不能保證。現在發生的是,在New OleDb.OleDbCommand(sql, conn)代碼執行時,conn變量不保證已經初始化。

這種疏忽會在雷達下飛行,一路直到您嘗試執行命令,在這裏:

Dim usr As String = cmd.ExecuteScalar.ToString 

除了需要括號函數調用,這不是UNIL這一點上,OleDbCommand對象最後嘗試使用先前提供的連接,並發現那裏有Nothing

雖然我引起了您的注意,但我還需要指出您對OleDb使用了錯誤的參數表示法(您需要使用?佔位符而不是@NameParameters)。另外,這是處理身份驗證的一種可怕的方式。 絕不會以純文本形式存儲密碼。

+0

你有什麼建議呢? 我以純文本存儲密碼,因爲它的學校。 – FrostVolkoff

+0

在存儲密碼之前,應該爲每個用戶添加鹽,然後應該通過密碼安全的單向散列算法運行鹽漬密碼。如果這是爲了學校,那很好,但你應該有一個正確的方式的普遍意識。 –

+0

現在說,在英語中,我不瞭解VB的大部分它的第一個大項目。 – FrostVolkoff

相關問題