首先,我不是一名专业程序员。所以在我的程序中可能存在一些大错误!
问题是:
我将Visual express中的WPF文件与MS Access数据库(格式2003)相关联。每当我尝试运行以下内容时(抱歉荷兰代码):
Public Sub ToevoegenPersoon(voornaam As String, achternaam As String, mailadres As String, geboortedatum As Date, klantennummer As Integer, specialeCategorie As String)
Dim opdracht As OleDbCommand
Dim sqlOpdracht As String
sqlOpdracht = "INSERT INTO Klant (Voornaam, achternaam, mailadres, geboortedatum, klantennummer, specialeCategorie)" & _
"VALUES (" & Chr(34) & "" & voornaam & "" & Chr(34) & "," & Chr(34) & "" & achternaam & "" & Chr(34) & "," & Chr(34) & "" & _
mailadres & "" & Chr(34) & "," & Convert.ToString(geboortedatum) & "," & Convert.ToString(klantennummer) & "," & Chr(34) & "" & specialeCategorie & "" & Chr(34) & ")"
opdracht = New OleDbCommand(sqlOpdracht, connectie)
Debug.WriteLine(sqlOpdracht)
MsgBox(sqlOpdracht)
opdracht.Connection.Open()
opdracht.ExecuteNonQuery()
opdracht.Connection.Close()
End Sub
我的程序总是出现ExecuteNonQuery()函数错误。此功能用于以下事件:
Private Sub btnKlantToevoegen_Click(sender As Object, e As RoutedEventArgs) Handles btnKlantToevoegen.Click
Dim achternaam As String = boxVoornaam.Text
Dim voornaam As String = boxAchternaam.Text
Dim emailadres As String = boxEmailadres.Text
Dim geboortedatum As Date = GeboortedatumSelectie.SelectedDate
Dim klantennummer As Integer = 5
Dim specialeCategorie As String = "Jeugd"
Try
database.ToevoegenPersoon(voornaam, achternaam, emailadres, geboortedatum, klantennummer, specialeCategorie)
Catch ex As Exception
End Try
boxAchternaam.Clear()
boxVoornaam.Clear()
boxEmailadres.Clear()
End Sub
在顶部,我声明以下内容将MS Access数据库与Visual express连接:
Private connectiestring As String = My.Settings.Database_Drijkoningen_Konings1ConnectionString
Private connectie As OleDbConnection
connectie = New OleDbConnection(connectiestring)
运行此程序时,executenonquery()会出错。我不知道它可能是什么。有人吗?
提前致谢
的Jeroen
答案 0 :(得分:1)
不确定这是否可以解决您的问题。我不知道错误信息。但是,我将展示一个简单的参数化查询,可能有很多帮助
Public Sub ToevoegenPersoon(voornaam As String, achternaam As String, mailadres As String, geboortedatum As Date, klantennummer As Integer, specialeCategorie As String)
Dim opdracht As OleDbCommand
Dim sqlOpdracht As String
sqlOpdracht = "INSERT INTO Klant (Voornaam, achternaam, mailadres, " & _
"geboortedatum, klantennummer, specialeCategorie) " & _
"VALUES (?,?,?,?,?,?)"
opdracht = New OleDbCommand(sqlOpdracht, connectie)
opdracht.Parameters.AddWithValue("@p1", voornaam)
opdracht.Parameters.AddWithValue("@p2", achternaam)
opdracht.Parameters.AddWithValue("@p3", mailadres)
opdracht.Parameters.AddWithValue("@p4", Convert.ToString(geboortedatum))
opdracht.Parameters.AddWithValue("@p5", Convert.ToString(klantennummer))
opdracht.Parameters.AddWithValue("@p6", specialeCategorie)
opdracht.Connection.Open()
opdracht.ExecuteNonQuery()
opdracht.Connection.Close()
End Sub
现在,通过参数化查询,命令文本上没有更多的连接,仅此一项将消除忘记值之间的某些引号或逗号的任何可能性。 (当然这也会删除Sql Injection问题和解析包含特殊字符的字符串)
还有一个问题需要解决。第4和第5个参数接收字符串值。这要求数据表上的基础字段是字符串字段而不是DateTime。如果不是这种情况,则需要传递(作为参数值)日期值