首页 > 解决方案 > 插入语句中的语法错误有什么问题

问题描述

Option Explicit On
Imports System.Data.OleDb
Public Class Form1
    Dim objCon As New OleDbConnection
    Dim strSQL As String
    Dim strConnect As String = "Provider= Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Abry\Documents\Bilik.accdb"
    Dim da As New OleDb.OleDbDataAdapter
    Dim ds As New DataSet

    Private Sub TempahButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TempahButton.Click
        Dim startDate As Date
        Dim str As String
        startDate = DateTimePicker1.Value

        objCon.ConnectionString = strConnect
        objCon.Open()
        str = "Insert into bilik(Bilik, Tujuan, Tarikh, Masa Masuk, Masa Keluar) values('" & BilikComboBox.SelectedIndex & "','" & TujuanTextBox.Text & "','" & DateTimePicker1.Value.ToShortDateString & "','" & MasaMasukMaskedTextBox.Text & "','" & MasaKeluarMaskedTextBox.Text & "')"

        Dim cmd As OleDbCommand = New OleDbCommand(str, objCon)
        cmd.Parameters.Add(New OleDbParameter("Bilik", CType(BilikComboBox.SelectedIndex, String)))
        cmd.Parameters.Add(New OleDbParameter("Tujuan", CType(TujuanTextBox.Text, String)))
        cmd.Parameters.Add(New OleDbParameter("Tarikh", CType(DateTimePicker1.Value, Date)))
        cmd.Parameters.Add(New OleDbParameter("Masa Masuk", CType(MasaMasukMaskedTextBox.Text, String)))
        cmd.Parameters.Add(New OleDbParameter("Masa Keluar", CType(MasaKeluarMaskedTextBox.Text, String)))

        Try
            cmd.ExecuteNonQuery()
            cmd.Dispose()
            objCon.Close()
            TujuanTextBox.Clear()
            BilikComboBox.Text = ""
            DateTimePicker1.Value = ""
            MasaMasukMaskedTextBox.Clear()
            MasaKeluarMaskedTextBox.Clear()
        Catch ex As Exception
            MsgBox(ex.Message)


        End Try


    End Sub
End Class

MS ACCESS 上的这个数据库

插入语句总是出错

标签: vb.net

解决方案


应为此项目和所有项目设置 Option Strict On。这是一个两部分的过程。首先对于当前项目 - 在解决方案资源管理器中双击我的项目。选择左侧的编译。在 Option Strict 下拉列表中选择 ON。未来项目的第二个 - 转到工具菜单 -> 选项 -> 项目和解决方案 -> VB 默认值。在 Option Strict 下拉列表中选择 ON。这将使您避免在运行时出现错误。

让您的数据库对象保持在本地,以便您可以控制它们是否被关闭和处置。Using...End Using即使出现错误,块也会为您执行此操作。

您正在将值连接到您的 sql 中(非常糟糕 - 打开您的应用程序以进行 sql 注入),然后在 Insert 语句中不存在任何参数时尝试添加参数。您可以使用问号作为参数的占位符或使用名称。Access 不关心名称;只是 sql 语句中的位置与参数添加到参数集合的顺序相匹配。我喜欢使用名称,因此我可以轻松检查我是否以正确的顺序添加参数。

.Text 属性包含一个字符串,因此无需将其转换为字符串。

DataTimePicker 的 .Value 属性是 DateTime。无需转换。

添加参数时,使用接受 OleDbType 的重载,理想情况下是大小。您将需要检查数据库中的字段以获取此信息。

在连接关闭之前不要显示消息框或明文框。连接是宝贵的对象,应在最后一刻打开并尽快关闭。

Dim strConnect As String = "Provider= Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Abry\Documents\Bilik.accdb"

Private Sub TempahButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TempahButton.Click
    Try
        Using objCon As New OleDbConnection(strConnect)
            Dim str = "Insert into bilik(Bilik, Tujuan, Tarikh, [Masa Masuk], [Masa Keluar]) values(@Bilik, @Tujuan, @Tarikh, @MasaMasuk, @MasaKeluar);"
            Using cmd As OleDbCommand = New OleDbCommand(str, objCon)
                cmd.Parameters.Add("@Bilik", OleDbType.VarChar).Value = BilikComboBox.SelectedIndex.ToString
                cmd.Parameters.Add("@Tujuan", OleDbType.VarChar).Value = TujuanTextBox.Text
                cmd.Parameters.Add("@Tarikh", OleDbType.Date).Value = DateTimePicker1.Value
                cmd.Parameters.Add("@MasaMasuk", OleDbType.VarChar).Value = MasaMasukMaskedTextBox.Text
                cmd.Parameters.Add("@MasaKeluar", OleDbType.VarChar).Value = MasaKeluarMaskedTextBox.Text
                objCon.Open()
                cmd.ExecuteNonQuery()
            End Using
        End Using 'Closes and disposes the connection
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
    TujuanTextBox.Clear()
    BilikComboBox.SelectedIndex = -1
    DateTimePicker1.Value = ""
    MasaMasukMaskedTextBox.Clear()
    MasaKeluarMaskedTextBox.Clear()
End Sub

推荐阅读