Vb.net ExecuteOnQuery()赢得';不适用于插入函数

Vb.net ExecuteOnQuery()赢得';不适用于插入函数,vb.net,Vb.net,首先,我不是一个专业的程序员。所以我的程序中可能有一些大错误 问题是: 我在visual express中将我的WPF文件与MS Access数据库(2003格式)链接。每当我尝试运行以下程序时(很抱歉使用荷兰代码): 我的程序总是有ExecuteNonQuery()函数的错误。此功能用于以下事件: Private Sub btnKlantToevoegen_Click(sender As Object, e As RoutedEventArgs) Handles btnKlantToevoeg

首先,我不是一个专业的程序员。所以我的程序中可能有一些大错误

问题是:

我在visual express中将我的WPF文件与MS Access数据库(2003格式)链接。每当我尝试运行以下程序时(很抱歉使用荷兰代码):

我的程序总是有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)
运行此程序时,ExecuteOnQuery()会给出一个错误。我根本不知道那是什么。有人知道吗

提前谢谢


Jeroen不确定这是否能解决您的问题。我不知道错误信息。不过,我将展示一个简单的参数化查询,它可能会有很大帮助

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注入问题和对包含特殊字符的字符串的解析)


还有一个问题需要解决。第四个和第五个参数接收字符串值。这要求datatable上的基础字段是字符串字段,而不是DateTime。如果不是这种情况,那么您需要只传递(作为参数值)日期值

您不能使用单引号而不是双引号吗?
我的程序总是有一个错误
是否愿意分享有关该错误的任何详细信息?您可以复制错误消息,这可能有助于调试并查看sqlOpdracht中的内容,我的猜测并不完全正确。。。紧急查看参数化sql查询,除了更安全之外,此类错误的可能性要小得多。我使用了您的代码,但删除了转换(因为Geboortedatam是数据库中的日期类型)。但是,现在我得到一个错误,即“SpecialCategorie”是我的插入函数中的未知字段名。您是否检查了表
Klant
,该字段是否存在,并且名称是否准确
SpecialCategorie
(大写/小写不重要)。此类别“SpecialCategorie”是一个受限字符串,有4种可能性。然而,这些可能性是基于“三K党”的出生年份。对不起,我不明白。如果使用Access打开数据库文件并查看表Klant的结构,是否看到名为SpecialCategorie的字段?如果是,它是什么数据类型?是的,我看到一个名为SpecialCategorie的列。它包含一个字符串,但是,只有四个选项可以填充它(Jeugd senior student regulier)
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