你好:)我是VB.NET的新手,我正在尝试创建一个“创建帐户”表单。然而,就像我在代码中添加的那样,每当我尝试调试时,它都会说无法连接到数据库?有人能告诉我什么是错的,谢谢你
Public Class Form2
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
' Check if username or password is empty
If TextBox1.Text = "" Or TextBox2.Text = "" Then
MessageBox.Show("Please complete the required fields.", "Authentication Error!", MessageBoxButtons.OK, MessageBoxIcon.Error)
Else
' Both fields was supply
' Check if user exist in database
' Connect to DB
Dim conn As New System.Data.OleDb.OleDbConnection()
conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Thesis\Thesis\Database2.accdb"
Try
'conn.Open()
'MsgBox("Susscess")
Dim sql As String = "INSERT * INTO tbl_user WHERE username='" & TextBox1.Text & "' AND password = '" & TextBox2.Text & "'"
Dim sqlCom As New System.Data.OleDb.OleDbCommand(sql)
'Open Database Connection
sqlCom.Connection = conn
conn.Open()
Dim sqlRead As System.Data.OleDb.OleDbDataReader = sqlCom.ExecuteReader()
If sqlRead.Read() Then
Form3.Show()
Me.Hide()
End If
Catch ex As Exception
MessageBox.Show("Failed to connect to Database..", "Database Connection Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End If
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Me.Hide()
Form1.Show()
End Sub
Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
End Sub
Private Sub TextBox1_TextChanged(sender As System.Object, e As System.EventArgs) Handles TextBox1.TextChanged
End Sub
End Class
答案 0 :(得分:0)
您已有效隐藏错误消息。如果您想确切知道发生了什么,您需要更改该catch块并从Exception对象中打印出错误消息。
像这样的东西
Catch ex as Exception
MessageBox.Show("Error:" & ex.Message)
End Try
说,您的代码中至少存在四个问题。
第一:您永远不应该使用字符串连接来创建sql命令。尽管访问有点复杂,但应避免Sql Injection的问题。使用参数还有助于消除由字符串值中存在单引号引起的可能的语法错误。
第二: PASSWORD
是Access中的保留字,如果不将其括在方括号中,则无法使用(如果可以,为了避免将来出现错误,请更改该列名称)< / p>
第三:您忘了关闭连接。这是一个微妙的问题,因为您没有立即注意到它。相反,您慢慢开始消耗系统资源,直到您尝试打开另一个连接时,在程序的不稳定点上,您会收到错误消息。在数据访问代码块周围应用Using statement,您将确保无论在该块内发生什么,当您退出结束使用语句时,连接将被关闭。在语法错误或其他问题引发异常的情况下也是如此。
第四 INSERT INTO使用的语法错误。请参阅此INSERT INTO语法,基本上您需要列出将接收值的列,然后将VALUES与列对应(使用参数占位符)。 INSERT子句在INSERT中没有意义(没有先前的记录可以查找或更新)
Try
Using conn = New System.Data.OleDb.OleDbConnection()
conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=C:\Thesis\Thesis\Database2.accdb"
Dim sql As String = "INSERT INTO tbl_user (username, [password]) " & _
"VALUES (@uname, @pwd)"
Dim sqlCom As New System.Data.OleDb.OleDbCommand(sql, conn)
sqlCom.Parameters.AddWithValue("@uname", TextBox1.Text)
sqlCom.Parameters.AddWithValue("@pwd", TextBox2.Text)
conn.Open()
....
End Using
Catch ex as Exception
MessageBox.Show("Error:" & ex.Message)
End Try
最后,从安全角度来看,以明文形式存储密码被认为是一种非常糟糕的做法。只需查看您的表,您(或其他人)就可以知道所有用户的密码。您应该学习如何存储和检索password hash