Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database ';在SQL语句结束后找到的字符。';_Database_Vb.net_Ms Access - Fatal编程技术网

Database ';在SQL语句结束后找到的字符。';

Database ';在SQL语句结束后找到的字符。';,database,vb.net,ms-access,Database,Vb.net,Ms Access,首先,我想澄清一下,我正在尝试编写一个注册表,它将用户键入的任何内容插入文本框中,并插入access数据库的字段中。但是,我遇到了一个奇怪的错误,告诉我在SQL语句后插入分号,我这样做了,因此收到了另一个错误,告诉我它是无效字符。为了解决这个问题,我正确地插入了分号。。。在“sqlRegister=sqlRegister&txt_email.Text&“);”之后 现在,我得到一个新错误: System.Data.OleDb.OleDbException:“在SQL语句结束后找到的字符。” 以下

首先,我想澄清一下,我正在尝试编写一个注册表,它将用户键入的任何内容插入文本框中,并插入access数据库的字段中。但是,我遇到了一个奇怪的错误,告诉我在SQL语句后插入分号,我这样做了,因此收到了另一个错误,告诉我它是无效字符。为了解决这个问题,我正确地插入了分号。。。在“sqlRegister=sqlRegister&txt_email.Text&“);”之后

现在,我得到一个新错误:
System.Data.OleDb.OleDbException:“在SQL语句结束后找到的字符。”

以下是我的runSQL模块:

Public Function runSQL(ByVal query As String) As DataTable 'connection variable is declared to establish connection to database
    Dim Connection As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=library_db.accdb")
    'dt variable is declared as a new table where data from the access database will be stored
    Dim dt As New DataTable 'variable declared to search through list of records in access database
    Dim DataAdapter As OleDb.OleDbDataAdapter

    Connection.Open() 'Initialise the connection to the access database
    DataAdapter = New OleDb.OleDbDataAdapter(query, Connection) 'Retrieves records as instructed by query
    dt.Clear() 'The data of the data table is cleared and filled with data retrieved by the DataAdapter
    DataAdapter.Fill(dt)
    Connection.Close() 'Connection to the access database is closed to reduce the number of open connections
    Return dt
End Function 
End Module
这是我的登记表:

        username = txt_user.Text
        password = txt_pass.Text
        email = txt_email.Text

        If txt_user.Text = "" Or txt_pass.Text = "" Or txt_email.Text = "" Or emailCheck(txt_email.Text) Then
            MsgBox("Please fill in all boxes in order to register")
        Else
            sqlRegister = "Insert into accounts(userID, "
            sqlRegister = sqlRegister & "Username, [Password], Email) values (' "
            sqlRegister = sqlRegister & userID & "', '"
            sqlRegister = sqlRegister & txt_user.Text & "', '"
            sqlRegister = sqlRegister & txt_pass.Text & "', '"
            sqlRegister = sqlRegister & txt_email.Text & "');'"
            runSQL(sqlRegister)
            MessageBox.Show("Registered!")

        End If

要将数据访问代码和用户界面代码分开,不应在用户界面中构建sql查询,而应将数据传递给数据访问代码

ADO.net提供的连接和其他几个类在内部使用非托管代码。他们有
.Dispose
方法来释放这些资源。编码器负责调用
.Dispose
方法。幸运的是.net提供了
使用…End使用
块来为我们处理这个问题

您没有检索数据,因此不需要
DataTable
DataAdapter
始终使用参数以避免sql注入。当您有一个自动编号字段时,您不会传递任何值。该值由数据库提供。您必须检查数据库中字段的数据类型和大小,因为我不得不猜测。您正在插入用户,因此希望
.ExecuteNonQuery
而不是
。填充数据表

看起来您正在将密码保存为纯文本。即使在示例代码中也不应该这样做,但这是为了您的研究

Public Sub InsertUser(UName As String, PWord As String, EMail As String)
    Using cn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=library_db.accdb"),
            cmd As New OleDbCommand("Insert Into accounts (UserName, [Password], Email) Values (@UName, @PWord, @Mail);", cn)
        cmd.Parameters.Add("@UName", OleDbType.VarChar, 100).Value = UName
        cmd.Parameters.Add("@PWord", OleDbType.VarChar, 100).Value = PWord
        cmd.Parameters.Add("@Mail", OleDbType.VarChar, 200).Value = EMail
        cn.Open()
        cmd.ExecuteNonQuery()
    End Using
End Sub

Private Sub OPCode()
    If txt_user.Text = "" OrElse txt_pass.Text = "" OrElse txt_email.Text = "" OrElse emailCheck(txt_email.Text) Then
        MsgBox("Please fill in all boxes in order to register")
        Exit Sub
    End If
    Try
        InsertUser(txt_user.Text, txt_pass.Text, txt_email.Text)
        MessageBox.Show("Registered!")
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try
End Sub

要将数据访问代码和用户界面代码分开,不应在用户界面中构建sql查询,而应将数据传递给数据访问代码

ADO.net提供的连接和其他几个类在内部使用非托管代码。他们有
.Dispose
方法来释放这些资源。编码器负责调用
.Dispose
方法。幸运的是.net提供了
使用…End使用
块来为我们处理这个问题

您没有检索数据,因此不需要
DataTable
DataAdapter
始终使用参数以避免sql注入。当您有一个自动编号字段时,您不会传递任何值。该值由数据库提供。您必须检查数据库中字段的数据类型和大小,因为我不得不猜测。您正在插入用户,因此希望
.ExecuteNonQuery
而不是
。填充数据表

看起来您正在将密码保存为纯文本。即使在示例代码中也不应该这样做,但这是为了您的研究

Public Sub InsertUser(UName As String, PWord As String, EMail As String)
    Using cn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=library_db.accdb"),
            cmd As New OleDbCommand("Insert Into accounts (UserName, [Password], Email) Values (@UName, @PWord, @Mail);", cn)
        cmd.Parameters.Add("@UName", OleDbType.VarChar, 100).Value = UName
        cmd.Parameters.Add("@PWord", OleDbType.VarChar, 100).Value = PWord
        cmd.Parameters.Add("@Mail", OleDbType.VarChar, 200).Value = EMail
        cn.Open()
        cmd.ExecuteNonQuery()
    End Using
End Sub

Private Sub OPCode()
    If txt_user.Text = "" OrElse txt_pass.Text = "" OrElse txt_email.Text = "" OrElse emailCheck(txt_email.Text) Then
        MsgBox("Please fill in all boxes in order to register")
        Exit Sub
    End If
    Try
        InsertUser(txt_user.Text, txt_pass.Text, txt_email.Text)
        MessageBox.Show("Registered!")
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try
End Sub

接受错误消息并删除字符:


接受错误消息并删除字符: