Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.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
Vb.net Can';t将数据保存到我的Access 2007数据库中_Vb.net - Fatal编程技术网

Vb.net Can';t将数据保存到我的Access 2007数据库中

Vb.net Can';t将数据保存到我的Access 2007数据库中,vb.net,Vb.net,我无法在Access 2007中保存数据。当我试图点击Save按钮时,我收到了消息 Insert Into语句中出现语法错误 我的代码中有什么错误 Private Sub Save_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Save.Click If Len(Trim(TxtUserid.Text)) = 0 Then MessageBox.Show("Please

我无法在Access 2007中保存数据。当我试图点击Save按钮时,我收到了消息

Insert Into语句中出现语法错误

我的代码中有什么错误

Private Sub Save_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Save.Click
    If Len(Trim(TxtUserid.Text)) = 0 Then
        MessageBox.Show("Please enter Student No.", "Input Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        TxtUserid.Focus()
        Exit Sub
    End If

    If Len(Trim(TxtUsername.Text)) = 0 Then
        MessageBox.Show("Please enter Username", "Input Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        TxtUsername.Focus()
        Exit Sub
    End If
    If Len(Trim(txtreenterpassword.Text)) = 0 Then
        MessageBox.Show("Please enter Password", "Input Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        txtreenterpassword.Focus()
        Exit Sub
    End If

    Try
        con = New OleDbConnection(cs)
        con.Open()
        Dim ct As String = "select Userid from Users where Userid=@find"

        cmd = New OleDbCommand(ct)
        cmd.Connection = con
        cmd.Parameters.Add(New OleDbParameter("@find", System.Data.OleDb.OleDbType.VarChar, 20, "Userid"))
        cmd.Parameters("@find").Value = TxtUserid.Text
        rdr = cmd.ExecuteReader()

        If rdr.Read Then
            MessageBox.Show("Student No. Already Exists", "Input Error", MessageBoxButtons.OK, MessageBoxIcon.Error)

            If Not rdr Is Nothing Then
                rdr.Close()
            End If
        Else
            con = New OleDbConnection(cs)
            con.Open()

            Dim ab As String = "insert into Users(Userid,USERNAME,USERTYPE,PASSWORD,FIRSTNAME,MI,LASTNAME,CONTACT,BIRTHDAY,Age) VALUES (@a1,@a2,@a3,@a4,@a5,@a6,@a7,@a8,@a9,@a10)"

            cmd = New OleDbCommand(ab)
            cmd.Connection = con
            cmd.Parameters.Add(New OleDbParameter("@a1", System.Data.OleDb.OleDbType.VarChar, 20, "Userid"))
            cmd.Parameters.Add(New OleDbParameter("@a2", System.Data.OleDb.OleDbType.VarChar, 100, "USERNAME"))
            cmd.Parameters.Add(New OleDbParameter("@a3", System.Data.OleDb.OleDbType.VarChar, 250, "USERTYPE"))
            cmd.Parameters.Add(New OleDbParameter("@a4", System.Data.OleDb.OleDbType.VarChar, 50, "PASSWORD"))
            cmd.Parameters.Add(New OleDbParameter("@a5", System.Data.OleDb.OleDbType.VarChar, 200, "FIRSTNAME"))
            cmd.Parameters.Add(New OleDbParameter("@a6", System.Data.OleDb.OleDbType.VarChar, 150, "MI"))
            cmd.Parameters.Add(New OleDbParameter("@a7", System.Data.OleDb.OleDbType.VarChar, 15, "LASTNAME"))
            cmd.Parameters.Add(New OleDbParameter("@a8", System.Data.OleDb.OleDbType.VarChar, 250, "CONTACT"))
            cmd.Parameters.Add(New OleDbParameter("@a9", System.Data.OleDb.OleDbType.VarChar, 15, "BIRTHDAY"))
            cmd.Parameters.Add(New OleDbParameter("@a10", System.Data.OleDb.OleDbType.VarChar, 250, "Age"))

            cmd.Parameters("@a1").Value = TxtUserid.Text
            cmd.Parameters("@a2").Value = TxtUsername.Text
            cmd.Parameters("@a3").Value = Cmbusertype.Text
            cmd.Parameters("@a4").Value = txtreenterpassword.Text
            cmd.Parameters("@a5").Value = TxtFirstname.Text
            cmd.Parameters("@a6").Value = txtMi.Text
            cmd.Parameters("@a7").Value = TxtLastname.Text
            cmd.Parameters("@a8").Value = TxtContact.Text
            cmd.Parameters("@a9").Value = DateTimePicker3.Text
            cmd.Parameters("@a10").Value = TxtAge.Text

            cmd.ExecuteReader()

            MessageBox.Show("Successfully Saved", "Issued Details", MessageBoxButtons.OK, MessageBoxIcon.Information)

            If con.State = ConnectionState.Open Then
                con.Close()
            End If
            con.Close()
        End If
    Catch ex As Exception
        MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        con.Dispose()
    End Try
End Sub
您为什么使用:

cmd.ExecuteReader()
你能试着使用:

cmd.ExecuteNonQuery()

把东西挪了挪。代码中的注释

Private Sub Save_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Save.Click
    'don't do everything is one huge procedure
    'this procedure is about saving data
    'Off load Validation code to a separate function
    If Not ValidInput() Then
        Exit Sub
    End If
    If Not UniqueUserID() Then
        Exit Sub
    End If

    Using con As New OleDbConnection(cs)
        'Notic the brackest surrounding PASSWORD
        Dim ab As String = "insert into Users(Userid,USERNAME,USERTYPE,[PASSWORD],FIRSTNAME,MI,LASTNAME,CONTACT,BIRTHDAY,Age) VALUES (@a1,@a2,@a3,@a4,@a5,@a6,@a7,@a8,@a9,@a10)"
        Using cmd As New OleDbCommand(ab, con)
            cmd.Connection = con
            'Excellent way to add parameters with the type and size
            cmd.Parameters.Add("@a1", System.Data.OleDb.OleDbType.VarChar, 20, "Userid").Value = TxtUserid.Text
            cmd.Parameters.Add("@a2", System.Data.OleDb.OleDbType.VarChar, 100, "USERNAME").Value = TxtUsername.Text
            cmd.Parameters.Add("@a3", System.Data.OleDb.OleDbType.VarChar, 250, "USERTYPE").Value = Cmbusertype.Text
            cmd.Parameters.Add("@a4", System.Data.OleDb.OleDbType.VarChar, 50, "[PASSWORD]").Value = txtreenterpassword.Text
            cmd.Parameters.Add("@a5", System.Data.OleDb.OleDbType.VarChar, 200, "FIRSTNAME").Value = TxtFirstname.Text
            cmd.Parameters.Add("@a6", System.Data.OleDb.OleDbType.VarChar, 150, "MI").Value = txtMi.Text
            cmd.Parameters.Add("@a7", System.Data.OleDb.OleDbType.VarChar, 15, "LASTNAME").Value = TxtLastname.Text
            cmd.Parameters.Add("@a8", System.Data.OleDb.OleDbType.VarChar, 250, "CONTACT").Value = TxtContact.Text
            cmd.Parameters.Add("@a9", System.Data.OleDb.OleDbType.VarChar, 15, "BIRTHDAY").Value = DateTimePicker3.Text
            cmd.Parameters.Add("@a10", System.Data.OleDb.OleDbType.VarChar, 250, "Age").Value = TxtAge.Text
            'Don't open the connection until right before it is used
            con.Open()
            cmd.ExecuteNonQuery()
        End Using
    End Using
    MessageBox.Show("Successfully Saved", "Issued Details", MessageBoxButtons.OK, MessageBoxIcon.Information)
End Sub

Private Function ValidInput() As Boolean
    If Len(Trim(TxtUserid.Text)) = 0 Then
        MessageBox.Show("Please enter Student No.", "Input Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        TxtUserid.Focus()
        Return False
    End If
    If Len(Trim(TxtUsername.Text)) = 0 Then
        MessageBox.Show("Please enter Username", "Input Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        TxtUsername.Focus()
        Return False
    End If
    If Len(Trim(txtreenterpassword.Text)) = 0 Then
        MessageBox.Show("Please enter Password", "Input Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        txtreenterpassword.Focus()
        Return False
    End If
    Return True
End Function

Private Function UniqueUserID() As Boolean
    Dim ReturnValue As Object 'We are using Object because it might have to hold a value of Nothing
    'Keep your database objects local so you can be sure they are closed and disposed
    'Using...End Using blocks to the for you
    Using con As New OleDbConnection(cs)
        'You can pass the command text and the connection directly to the constructor of the command
        Using cmd As New OleDbCommand("select 1 from Users where Userid=@find", con)
            'The add method will create the Parameter for you. No need for New Parameter
            'You can also add the .Value property directly in this line
            cmd.Parameters.Add("@find", System.Data.OleDb.OleDbType.VarChar, 20, "Userid").Value = TxtUserid.Text
            con.Open()
            ReturnValue = cmd.ExecuteScalar() 'Retrieves the first column of the first row in the resultset
        End Using
    End Using
    If ReturnValue Is Nothing Then
        'insert the record
        Return True
    ElseIf CInt(ReturnValue) = 1 Then
        MessageBox.Show("Student No. Already Exists", "Input Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        Return False
    Else
        Return False
    End If
End Function
顺便说一句,在数据库中存储年龄不是一个好主意。它可以在第二天改变!只需根据需要存储生日和计算年龄


另一份说明;您可能需要检查DateTimePicker返回的文本。我相信这取决于设置。Short似乎工作得很好。

例如,你确定
Age
是一个
VarChar
(字符串,本地编码),有250个字符(我的意思是,一个可以有多大)
Userid
看起来也可能是另一种类型。检查Access中的实际字段类型。数据库中可能存在重复的字段名为“PASSWORD”,该字段是Access中的一个字段。您必须像链接副本中显示的那样括起名称“[密码]”(无引号),好的,我会更改它。谢谢,先生:)如果我的答案对你有用,请点击我答案左边的复选标记(勾号)接受。