2015-05-21 47 views
0

我是一個新手,我的代碼如此原諒我,如果我的問題似乎基本,但我有一些麻煩,從此While循環提取我的變量,然後使用我的SQL查詢的結果驗證。需要幫助從VB.Net的While循環提取變量

下面這個腳本是事件處理的一個.aspx窗體上的登錄按鈕的處理,將在相關MSSQL數據庫中的電子郵件,以及登陸場:

Public Class _Default 
Inherits System.Web.UI.Page 
Protected Sub submit_Click(sender As Object, e As EventArgs) Handles submit.Click 
    Dim Column1 As String 
    Dim Column2 As String 
    Dim SQL = "SELECT * FROM Logins WHERE Email='" & email.Text & "' AND Password='" & password.Text & "'" 
    Dim oSqlDataReader As System.Data.SqlClient.SqlDataReader = Nothing 
    Using oSqlConnection As New System.Data.SqlClient.SqlConnection("SERVER=[Server Name];UID=[User];PWD=[Pass];DATABASE=[Database Name]") 
     oSqlConnection.Open() 
     Using oSqlCommand As New System.Data.SqlClient.SqlCommand(SQL, oSqlConnection) 
      oSqlDataReader = oSqlCommand.ExecuteReader 
      While oSqlDataReader.Read 
       Column1 = oSqlDataReader(name:="Email") 
       Column2 = oSqlDataReader(name:="Password") 
      End While 
     End Using 
     oSqlConnection.Close() 
    End Using   
    If "Column 1 etc." 
    End if 
End Sub 
End Class 

至於我可以告訴我的代碼工作沒有錯誤,但每次我嘗試創建一個If語句我的變量Column 1 and Column 2未聲明使他們無用。

如果任何人都可以幫助我的代碼或缺失區域的正確佈局,並解釋我出錯的地方會很棒。

+0

循環結束後執行'If'部分意味着'Column1'和'Column2'將包含最後一次讀取的值。那是你要的嗎? –

+0

最後返回的價值應該沒問題。 SQL查詢應該只返回一個值,即一個有效的電子郵件地址和密碼,如果返回一個值,那麼我認爲電子郵件和密碼是可以接受和正在進行的。 至於安全性,我仍然是一個新手,並且瞭解它並不是最安全的系統,我現在一定會查找'sql-parameters',以備將來使用,或者在這個項目中,如果我可以得到它的工作,哈哈 –

+0

移動我的If語句會阻止Visual Studio在進入具有未聲明列1和列的調試模式時出現錯誤;謝謝@David。 雖然他們仍然返回「Nothing」,但我懷疑這是由於我在VS 2013上運行SSMS 2014而導致服務器連接問題;我會試着去掌握一個早期的SSMS。 謝謝你的幫助,雖然每個人:) –

回答

0

如果將If塊移到循環中,是否更接近您期望的行爲?

Protected Sub submit_Click(sender As Object, e As EventArgs) Handles submit.Click 
    Dim Column1 As String 
    Dim Column2 As String 
    Dim SQL = "SELECT * FROM Logins WHERE Email='" & email.Text & "' AND Password='" & password.Text & "'" 

    Dim oSqlDataReader As System.Data.SqlClient.SqlDataReader = Nothing 

    Using oSqlConnection As New System.Data.SqlClient.SqlConnection("SERVER=[Server Name];UID=[User];PWD=[Pass];DATABASE=[Database Name]") 
     oSqlConnection.Open() 

     Using oSqlCommand As New System.Data.SqlClient.SqlCommand(SQL, oSqlConnection) 
      oSqlDataReader = oSqlCommand.ExecuteReader 

      While oSqlDataReader.Read 
       Column1 = oSqlDataReader(name:="Email") 
       Column2 = oSqlDataReader(name:="Password") 

       If "Column 1 etc....." 
       End if 
      End While 
     End Using 

     oSqlConnection.Close() 
    End Using 
End Sub 
0

可能是因爲您的查詢沒有返回任何行,或者返回的值是dbNull或什麼都沒有。我會檢查數據返回和錯誤,如果適當的話。

嘗試直接對數據庫運行查詢。你回來了嗎?

要避免錯誤,你可以聲明字符串的String.Empty

Dim Column1 As String = String.empty 

或者,在if語句檢查沒有使用它的時候:

If Column1 Is Not Nothing AndAlso ... 
0

不要使用字符串連接建立你的SQL查詢。相反,使用sql參數來防止SQL注入和其他問題。

我必須承認我不知道這個語法:oSqlDataReader(name:="Email")。使用下列內容:

Dim email As String 
Dim password As String 
Dim sql = "SELECT * FROM Logins WHERE [email protected] AND [email protected]" 

Using oSqlConnection As New System.Data.SqlClient.SqlConnection("SERVER=[Server Name];UID=[User];PWD=[Pass];DATABASE=[Database Name]") 
    Using oSqlCommand As New System.Data.SqlClient.SqlCommand(sql, oSqlConnection) 
     oSqlCommand.Parameters.Add("@Email", SqlDbType.VarChar).Value = email.Text 
     oSqlCommand.Parameters.Add("@Password", SqlDbType.VarChar).Value = password.Text 
     oSqlConnection.Open() 
     Using oSqlDataReader = oSqlCommand.ExecuteReader() 
      If oSqlDataReader.Read() Then 
       Dim emailColIndex = oSqlDataReader.GetOrdinal("Email") 
       Dim pwdColIndex = oSqlDataReader.GetOrdinal("Password") 
       email = oSqlDataReader.GetString(emailColIndex) 
       password = oSqlDataReader.GetString(pwdColIndex) 
      End If 
     End Using 
    End Using 
End Using ' oSqlConnection.Close() not needed with using ' 

If email IsNot Nothing AndAlso password IsNot Nothing Then 

End If 

但不是初始化兩個字符串變量,你應該實現一個Login類,您可以初始化,並從方法返回。你不想知道電子​​郵件和密碼,因爲你已經有了它們。

因爲這是ASP.NET,我建議看看可用的membership provider哪些是強大的,有一個學習曲線,但它絕對是值得的。