Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
End Sub
Private Sub GroupBox1_Enter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GroupBox1.Enter
End Sub
Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim add As String = "insert into setplan(ma,planqty,side,start,end,total,remarks) values ('" & cmbshift.SelectedItem & "','" & txtplqty.Value & "','" & cmbside.SelectedItem & "','" & timestart.Text & "','" & timeend.Text & "','" & txttotal.Text & "','" & txtrem.Text & "')"
Dim connection As String = "Provider=Microsoft.Ace.Oledb.12.0; Data Source=C:\Users\Administrator\Documents\plan.mdb; Persist Security Info=False;"
Using conn As New OleDb.OleDbConnection(connection)
Try
conn.Open()
If cmbshift.SelectedItem = "" Then
MsgBox("Please Select Shift Schedule")
ElseIf txtplqty.Value = 0 Then
MsgBox("Please Input Plan Quantity")
ElseIf cmbside.SelectedItem = "" Then
MsgBox("Please select Side")
ElseIf timestart.Text = "" Then
MsgBox("Please Select A Start Time")
ElseIf timeend.Text = "" Then
MsgBox("Please Select A Start Time")
ElseIf timeend.Text = timestart.Text Then
MsgBox("Time end must not be equal to Time Start")
Else
MsgBox(add)
Dim cmd As New OleDb.OleDbCommand(add, conn)
cmd.ExecuteNonQuery()
MsgBox("New Schedule Added")
End If
conn.Close()
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Using
End Sub
Private Sub timestart_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles timestart.ValueChanged
End Sub
结束班
答案 0 :(得分:1)
start
和end
字对于sql是唯一的,因此这些关键字可能会导致问题。尝试将这些列名称切换为startTime
和endTime
,并检查是否有效。
答案 1 :(得分:0)
正如评论中所述,如果你要将其作为参数化查询而不是将字符串连接成显式SQL命令,那会好得多。尽管如此,使用您的示例,有一些事情可能导致您描述的错误,其中一些已在评论中提及(以及 Atilla 的答案)。 / p>
Start
和End
是SQL中的保留关键字。将它们用作列名称可能会导致在从.NET应用程序通过OleDb
对这些列执行查询时出现意外行为。基本上有两种解决方法:
StartTime
和EndTime
,这可能效果很好。.mdb
)文件,因此您可以将查询中的列名称括在方括号中(例如[Start]
和[End]
) 在使用Access数据库时,我实际上已经采用这种方式封闭所有我的表和列名称,因为我们有一些列名包含空格等的数据库,所以这有很大帮助。
INSERT
数据的列的实际数据类型。同样,由于您似乎正在使用Access数据库文件,因此需要查看几个语法事项。
Date/Time
字段的值应使用#
字符而不是'
字符包装。Number
或Currency
)不应包含'
字符(或任何其他字符,就此而言) Short Text
或Long Text
)包含任何数量的" special/invalid characters"包括单引号和/或双引号,这些都需要清理干净"在执行查询之前。如果是这种情况(或者可能可能),您可以创建一个方法来在SQL命令中使用之前清除字符串值。 请参阅此帖子底部的示例,其中大部分(如果不是全部)可能无效的字符只是从字符串值中删除。请注意,出于本答案的目的,我使用了MS Access UI中的数据类型名称而不是实际的OleDb / Odbc数据类型来尝试简化操作
在不知道数据库表中使用的实际数据类型或来自表单控件的值的情况下,我只能做出假设,但是,如果我 绝对必须 使用这种类型的查询构建(意思是,由于某些原因它不可能使其参数化),我可能会创建查询以查找更像这样的内容:
Dim add As String = "INSERT INTO setplan " & _
"([ma], [planqty], [side], [start], [end], [total], [remarks]) " & _
"VALUES ('" & cmbshift.SelectedItem & "', " & _
txtplqty.Value & ", " & _
"'" & cmbside.SelectedItem & "', " & _
"#" & timestart.Text & "#, " & _
"#" & timeend.Text & "#, " & _
txttotal.Text & ", " & _
"'" & txtrem.Text & "')"
这假定[start]
和[end]
列为Date/Time
列,[planqty]
和[total]
列为Number
的某种类型列(整数,单一等)。
HOWEVER:如上所述,最好将其作为参数化查询。查看此SO问题的已接受答案,了解有关如何执行此操作的详细信息: VB.Net - Inserting data to Access Database using OleDb
连接SQL命令时String值的清理函数示例:
Friend Function CleanStringForSQL(ByVal DirtyString As String) As String
Dim CleanString As String = DirtyString.Replace("'", "")
CleanString = CleanString.Replace("""", "")
CleanString = CleanString.Replace("*", "")
CleanString = CleanString.Replace("\", "")
CleanString = CleanString.Replace("/", "")
CleanString = CleanString.Replace(";", "")
CleanString = CleanString.Replace("%", "")
CleanString = CleanString.Replace("#", "")
CleanString = CleanString.Replace("(", "")
CleanString = CleanString.Replace(")", "")
CleanString = CleanString.Replace("[", "")
CleanString = CleanString.Replace("]", "")
Return CleanString
End Function
然后可以在SQL命令字符串的声明语句中使用它,如:
...
"VALUES ('" & CleanStringForSQL(cmbshift.SelectedItem) & "', " & _
...