Bekijk Volledige Versie : De instructie INSERT bevat een syntaxisfout. (asp.net, vb, ms acces)
Ik krijg volgende foutcode als ik op "btnInsert" heb geklikt om een formulier in te voegen in mijn database.
De instructie INSERT bevat een syntaxisfout.
code is ASP.NET, Vb en database is ms access
Hieronder de code voor de actie van btnInsert klik (INSERT).
Protected Sub btnInsert_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnInsert.Click
Dim objCn As New System.Data.OleDb.OleDbConnection(strCn)
objCn.Open()
If id.Text <> "" Then
' Bestaand record => update
strSql = "UPDATE entries SET titel = @titel, " _
& "text = @text, " _
& "category = @category, " _
& "date = @date, " _
& "must = @must " _
& "WHERE id = @id; "
Else
' Nieuw record => Insert
strSql = "INSERT INTO entries(titel, text, category, date, must) " _
& "VALUES(@titel,@text,@category,@date,@must);"
End If
Dim objCmd As New System.Data.OleDb.OleDbCommand(strSql, objCn)
objCmd.Parameters.Clear()
objCmd.Parameters.Add("@titel", OleDbType.VarChar)
objCmd.Parameters("@titel").Value = titel.Text
objCmd.Parameters.Add("@text", OleDbType.VarChar)
objCmd.Parameters("@text").Value = FreeText.Text
objCmd.Parameters.Add("@category", OleDbType.VarChar)
If newCat.Text = "" Then
objCmd.Parameters("@category").Value = DropDownListCat.SelectedValue
Else
objCmd.Parameters("@category").Value = newCat.Text
End If
objCmd.Parameters.Add("@date", OleDbType.Date)
objCmd.Parameters("@date").Value = CType(lblDate.Text, Date)
objCmd.Parameters.Add("@must", OleDbType.Boolean)
objCmd.Parameters("@must").Value = CheckBoxMust.Checked
If id.Text <> "" Then
' parameter voor id aanmaken
objCmd.Parameters.Add("@id", OleDbType.Integer)
objCmd.Parameters("@id").Value = CType(id.Text, Integer)
End If
Try
objCmd.ExecuteNonQuery()
Catch ex As Exception
boodschap.ForeColor = Drawing.Color.Red
boodschap.Text = "Er trad een fout op bij het bewaren van de gegevens.<br />" & ex.Message
Exit Sub
Finally
If objCn.State = Data.ConnectionState.Open Then
objCn.Close()
End If
End Try
' Indioen nodig de nieuwe id ophalen voor verdere verwerking
If id.Text = "" Then
id.Text = GetHighestId().ToString
End If
boodschap.ForeColor = Drawing.Color.Green
boodschap.Text = "De gegevens zijn bewaard."
End Sub
Heb niet zoveel kaas gegeten van ASP, maar moet het niet zijn:
strSql = "INSERT INTO entries(titel, text, category, date, must) " _
& "VALUES(@titel,@text,@category,@date,@must)";
neen dit is normaal juist. de ; moeten binnen de "" staan.
Heb dus nog steeds hetzelfde probleem.
Alvast bedankt.
Ok, probeer dan eens SINGLE QUOTES om de vars:
strSql = "INSERT INTO entries(titel, text, category, date, must) " _
& "VALUES('@titel','@text','@category','@date','@must ');"
Ramon Fincken
15/08/07, 17:01
laat de strSql query eens zien zoals hij m wil plaatsen ?
in php heet dat echo $queryinstructie;
heb je het ook met
`titel`,`text` etc.... geprobeerd ?
VDBAHosting
15/08/07, 17:17
Ok, probeer dan eens SINGLE QUOTES om de vars:
strSql = "INSERT INTO entries(titel, text, category, date, must) " _
& "VALUES('@titel','@text','@category','@date','@must ');"
Volgens mij moet je inderdaad alle string waardes tussen single quotes zetten, volgens mij hoeft dit niet met integers. Verder neem ik aan dat
er geen enge quotes of andere vreemde tekens in je invoer zitten.
Probeer overigens ook even de volgende stukjes te veranderen: "entries(titel," => "entries (titel," en "VALUES(@titel" => "VALUES ('@titel"
Succes!
Hieronder volledige VB code:
Imports System.Data
Imports System.Data.OleDb
Partial Class insertentrie
Inherits System.Web.UI.Page
Dim strCn, strSql As String
Dim intId As Integer
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
strCn = ConfigurationManager.ConnectionStrings("databasename").ConnectionString
' Indien een bestaand record opgevraagd wordt zullen de gegevens uit de DB
' gehaald en getoont worden.
If Request.QueryString("id") <> "" Then
' Er werd een id doorgegeven
intId = CType(Request.QueryString("id"), Integer)
id.Text = intId.ToString
If Not Page.IsPostBack Then
entriesById(intId)
End If
End If
If Not Page.IsPostBack Then
DropDownListCat.DataTextField = "category"
DropDownListCat.DataValueField = "category"
DropDownListCat.DataSource = GetCode()
DropDownListCat.DataBind()
End If
If lblDate.Text = "" Then
lblDate.Text = Date.Now
End If
End Sub
Private Function GetCode() As Data.DataSet
Dim objCn As New System.Data.OleDb.OleDbConnection(strCn)
objCn.Open()
strSql = "SELECT * FROM entries ORDER BY category ASC;"
Dim objCmd As New OleDbCommand(strSql, objCn)
Dim objDa As New OleDbDataAdapter(objCmd)
Dim objDs As New Data.DataSet
objDa.Fill(objDs, "entries")
If objCn.State = Data.ConnectionState.Open Then
objCn.Close()
End If
Return objDs
End Function
Protected Sub btnInsert_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnInsert.Click
Dim objCn As New System.Data.OleDb.OleDbConnection(strCn)
objCn.Open()
If id.Text <> "" Then
' Bestaand record => update
strSql = "UPDATE entries SET titel = @titel, " _
& "text = @text, " _
& "category = @category, " _
& "date = @date, " _
& "must = @must " _
& "WHERE id = @id; "
Else
' Nieuw record => Insert
strSql = "INSERT INTO entries(titel, text, category, date, must) " _
& "VALUES(@titel,@text,@category,@date,@must);"
End If
Dim objCmd As New System.Data.OleDb.OleDbCommand(strSql, objCn)
objCmd.Parameters.Clear()
objCmd.Parameters.Add("@titel", OleDbType.VarChar)
objCmd.Parameters("@titel").Value = titel.Text
objCmd.Parameters.Add("@text", OleDbType.VarChar)
objCmd.Parameters("@text").Value = FreeText.Text
objCmd.Parameters.Add("@category", OleDbType.VarChar)
If newCat.Text = "" Then
objCmd.Parameters("@category").Value = DropDownListCat.SelectedValue
Else
objCmd.Parameters("@category").Value = newCat.Text
End If
objCmd.Parameters.Add("@date", OleDbType.Date)
objCmd.Parameters("@date").Value = CType(lblDate.Text, Date)
objCmd.Parameters.Add("@must", OleDbType.Boolean)
objCmd.Parameters("@must").Value = CheckBoxMust.Checked
If id.Text <> "" Then
' parameter voor id aanmaken
objCmd.Parameters.Add("@id", OleDbType.Integer)
objCmd.Parameters("@id").Value = CType(id.Text, Integer)
End If
Try
objCmd.ExecuteNonQuery()
Catch ex As Exception
boodschap.ForeColor = Drawing.Color.Red
boodschap.Text = "Er trad een fout op bij het bewaren van de gegevens.<br />" & ex.Message
Exit Sub
Finally
If objCn.State = Data.ConnectionState.Open Then
objCn.Close()
End If
End Try
' Indioen nodig de nieuwe id ophalen voor verdere verwerking
If id.Text = "" Then
id.Text = GetHighestId().ToString
End If
boodschap.ForeColor = Drawing.Color.Green
boodschap.Text = "De gegevens zijn bewaard."
End Sub
Private Function GetHighestId() As Integer
Dim objCn As New System.Data.OleDb.OleDbConnection(strCn)
objCn.Open()
strSql = "SELECT MAX(id) AS Hoogste FROM entries;"
Dim objCmd As New OleDbCommand(strSql, objCn)
Dim objDa As New OleDbDataAdapter(objCmd)
Dim objDs As New Data.DataSet
objDa.Fill(objDs, "max")
If objCn.State = Data.ConnectionState.Open Then
objCn.Close()
End If
If objDs.Tables("max").Rows.Count <> 0 Then
Return objDs.Tables("max").Rows(0).Item("Hoogste")
Else
Return -1
End If
End Function
Private Sub entriesById(ByVal intLocalId As Integer)
Dim objCn As New System.Data.OleDb.OleDbConnection(strCn)
objCn.Open()
strSql = "SELECT * FROM entries WHERE id = @id;"
Dim objCmd As New OleDbCommand(strSql, objCn)
objCmd.Parameters.Add("@id", OleDbType.Integer)
objCmd.Parameters("@id").Value = intLocalId
Dim objDa As New OleDbDataAdapter(objCmd)
Dim objDs As New Data.DataSet
objDa.Fill(objDs, "entries")
If objCn.State = Data.ConnectionState.Open Then
objCn.Close()
End If
' Plaats de gegevens van het prospectrecord in de tekstvakken
If objDs.Tables("entries").Rows.Count > 0 Then
id.Text = objDs.Tables("entries").Rows(0).Item("id").ToString
titel.Text = objDs.Tables("entries").Rows(0).Item("titel").ToString
FreeText.Text = objDs.Tables("entries").Rows(0).Item("text").ToString
DropDownListCat.SelectedValue = objDs.Tables("entries").Rows(0).Item("category").ToString
lblDate.Text = objDs.Tables("entries").Rows(0).Item("date").ToString
CheckBoxMust.Checked = objDs.Tables("entries").Rows(0).Item("must")
Else
boodschap.ForeColor = Drawing.Color.Red
boodschap.Text = "De gevraagde gegevens werden niet gevonden."
End If
End Sub
Protected Sub btnDelete_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnDelete.Click
intId = CType(id.Text, Integer)
Dim objCn As New System.Data.OleDb.OleDbConnection(strCn)
objCn.Open()
strSql = "DELETE FROM entries WHERE id = @id;"
Dim objCmd As New System.Data.OleDb.OleDbCommand(strSql, objCn)
objCmd.Parameters.Clear()
' parameter voor id aanmaken
objCmd.Parameters.Add("@id", OleDbType.Integer)
objCmd.Parameters("@id").Value = intId
Try
objCmd.ExecuteNonQuery()
Catch ex As Exception
boodschap.ForeColor = Drawing.Color.Red
boodschap.Text = "Er trad een fout op bij het verwijderen van de gegevens.<br />" & ex.Message
Exit Sub
Finally
If objCn.State = Data.ConnectionState.Open Then
objCn.Close()
End If
End Try
Response.Redirect("index.aspx")
End Sub
Protected Sub btnRefresh_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnRefresh.Click
Response.Redirect("insertentrie.aspx")
' Formulier in status voor nieuwe ingave brengen
id.Text = ""
titel.Text = ""
FreeText.Text = ""
DropDownListCat.DataTextField = ""
lblDate.Text = ""
CheckBoxMust.Checked = False
newCat.Text = ""
End Sub
End Class
Begrijp dat het dus nog steeds niet werkt met de aangedragen opties?
Al geprobeerd met die Quotes (' ') om de vars?
Probleem is opgelost.
Het probleem was:
Had in de database een veld "date" en een vel "text". Dit mag je niet gebruiken ( toch zeker niet bij oleDb) omdat het gereserveerde woorden zijn voor SQL opdrachten.