2013-03-31 48 views
1

我試圖運行此代碼,並且每當我按下'註冊'按鈕時,什麼都沒有發生(頁面就像加載,但留在同一頁)ASP.NET/VB.NET/SQL Server 2012 - 頁面繼續加載

代碼:

Public Sub register() 



    Dim Username As String = txtUsername.Text 
    Dim Surname As String = txtSurname.Text 
    Dim Password As String = txtPassword.Text 
    Dim Name As String = txtName.Text 
    Dim Address1 As String = txtAddress1.Text 
    Dim Address2 As String = txtAddress2.Text 
    Dim City As String = txtCity.Text 
    Dim Email As String = txtEmail.Text 
    Dim Country As String = drpCountry.Text 
    Dim DOB As Date = calDOB.SelectedDate 
    Dim Occupation As String = txtOccupation.Text 
    Dim WorkLocation As String = txtWorkLocation.Text 
    Dim Age As Integer = Date.Today.Year - calDOB.SelectedDate.Year 


    Dim ProjectManager As String = "N/A" 
    Dim TeamLeader As String = "N/A" 
    Dim TeamLeaderID As Integer = "1" 
    Dim ProjectManagerID As Integer = "1" 

    Dim RegistrationDate As Date = DateTime.Today 
    Dim ContractType As String = "N/A" 
    Dim ContractDuration As Integer = 6 
    Dim Department As String = "N/A" 

    Dim conn As New SqlConnection("Data Source=BRIAN-PC\SQLEXPRESS;Initial Catalog=master_db;Integrated Security=True") 
    Dim registerSQL As SqlCommand 
    Dim sqlComm As String 

    Dim validateSQL As SqlCommand 

    Dim sqlValidate As String 

    sqlValidate = "SELECT * FROM users where username=" + txtUsername.Text.ToString 

    sqlComm = "INSERT INTO users(Username, Password, Name, Surname, Address1, Address2, " + 
     "City, Country, date_of_birth, age, Occupation, department, work_location, " + 
     "project_manager,team_leader, team_leader_id, project_manager_id, " + 
     "date_registration, contract_type, contract_duration) " + 
     "VALUES(@p1, @p2,@p3,@p4,@p5,@p6,@p7,@p8,@p9,@p10,@p11,@p12,@p13,@p14,@p15," + 
     "@p16,@p17,@p18,@p19,@p20)" 

    conn.Open() 

    validateSQL = New SqlCommand(sqlValidate, conn) 
    Dim dr As SqlDataReader = validateSQL.ExecuteReader() 

    If dr.HasRows = False Then 


     validateSQL = New SqlCommand(sqlValidate, conn) 
     validateSQL.CommandText = sqlValidate 

     Dim reader As SqlDataReader = validateSQL.ExecuteReader() 
     reader.Read() 

     registerSQL = New SqlCommand(sqlComm, conn) 
     registerSQL.Parameters.AddWithValue("@p1", Username) 
     registerSQL.Parameters.AddWithValue("@p2", Password) 
     registerSQL.Parameters.AddWithValue("@p3", Name) 
     registerSQL.Parameters.AddWithValue("@p4", Surname) 
     registerSQL.Parameters.AddWithValue("@p5", Address1) 
     registerSQL.Parameters.AddWithValue("@p6", Address2) 
     registerSQL.Parameters.AddWithValue("@p7", City) 
     registerSQL.Parameters.AddWithValue("@p8", Country) 
     registerSQL.Parameters.AddWithValue("@p9", DOB) 
     registerSQL.Parameters.AddWithValue("@p10", Age) 
     registerSQL.Parameters.AddWithValue("@p11", Occupation) 
     registerSQL.Parameters.AddWithValue("@p12", Department) 
     registerSQL.Parameters.AddWithValue("@p13", WorkLocation) 
     registerSQL.Parameters.AddWithValue("@p14", ProjectManager) 
     registerSQL.Parameters.AddWithValue("@p15", TeamLeader) 
     registerSQL.Parameters.AddWithValue("@p16", TeamLeaderID) 
     registerSQL.Parameters.AddWithValue("@p17", ProjectManagerID) 
     registerSQL.Parameters.AddWithValue("@p18", RegistrationDate) 
     registerSQL.Parameters.AddWithValue("@p19", ContractType) 
     registerSQL.Parameters.AddWithValue("@p20", ContractDuration) 

     registerSQL.ExecuteNonQuery() 

     conn.Close() 

    ElseIf dr.HasRows = True Then 


     lblUsername.Text = "That Username (" + txtUsername.Text + ") is already registered/taken." 
     lblUsername.Visible = True 
     conn.Close() 

    End If 


End Sub 

按鈕事件處理程序:

Protected Sub btnRegister_Click(sender As Object, e As EventArgs) Handles btnRegister.Click 

    register() 


End Sub 

一些錯誤的代碼?

+0

哪個代碼調用此子?這不是一個事件處理程序,並且您沒有顯示處理單擊事件的代碼。 – Steve

+0

@Steve我更新了這個問題。謝謝 ! – Brian

回答

0

From MSDN

當正在使用的SqlDataReader的,相關聯的SqlConnection是服務於SqlDataReader的 忙,並在除關閉它以外的的SqlConnection執行任何其他操作可以是 。 的情況就是這種情況,直到SqlDataReader的Close方法被調用。例如, 直到調用關閉之後才能檢索輸出參數。

當您嘗試執行插入命令時,看起來您打開了SqlDataReader。
我會嘗試從性能比較的參數使用INSERT命令

If dr.HasRows = False Then 
    dr.Close() 

    ' The following lines are probably a remainder of a copy/paste operation' 
    ' They are not needed and you should remove them' 

    'validateSQL = New SqlCommand(sqlValidate, conn)' 
    'validateSQL.CommandText = sqlValidate' 
    'Dim reader As SqlDataReader = validateSQL.ExecuteReader()' 
    'reader.Read()' 

    ' Now execute the insert command 

而且你的命令檢查用戶存在之前關閉它,除了是錯誤的,因爲引入了SQL注入的可能性。

總結嘗試用這些變化....

sqlValidate = "SELECT * FROM users where [email protected]" 
validateSQL = New SqlCommand(sqlValidate, conn) 
validateSQL.Parameters.AddWithValue("@uname", txtUserName.Text) 
Dim dr As SqlDataReader = validateSQL.ExecuteReader() 
Dim userFound = dr.HasRows 
dr.Close() 
if userFound = False then 
    ...... 
+0

所以我刪除了額外的打開的連接,現在我又在'validateSQL = New SqlCommand(sqlValidate,conn) Dim dr As error SqlDataReader = validateSQL.ExecuteReader() conn.Close()錯誤是:Invalid列名'cdarwin'。 (cdarwin是用戶名文本框中輸入的用戶名) – Brian

+0

否'conn.Close()',這會關閉連接,它是您需要關閉的DataReader'dr.Close()'.... – Steve

+0

無效列名稱,因爲你不使用參數(並在你原來的命令中,你忘記了單引號) – Steve

相關問題