vb.net - 插入语句中的语法错误有什么问题
问题描述
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 上的这个数据库
插入语句总是出错
解决方案
应为此项目和所有项目设置 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
推荐阅读
- python - 我如何将 python 脚本放在云上?(带有 csv 和 sqlite 文件)
- delphi - TStringGrid中的Delphi多色值
- spring-boot - SocketException:操作系统错误:连接被拒绝,errno = 111 Spring Boot,颤振
- css - CSS - 视频不完全适合其容器
- opengl - OpenGL - 使用 g++ 链接 glew 和 glut 库和 dll
- javascript - 为什么当我尝试访问特定值时我的 JSON 数组响应返回未定义
- c++ - 为什么c++空类没有字节对齐?
- android-studio - 带有android studio的新flutter应用程序无法在android模拟器上运行-出现异常:线程“main”javax.net.ssl.SSLHandshakeException中的异常:
- java - JPanel 透明背景和显示元素
- sql - 需要在 WHERE 子句中满足两个条件的 SQL