2011-07-14 32 views
0

编辑:在asp.net应用程序中更新查询语法错误

此问题已更改。 HansUp在更新语句中解决了这个语法问题。现在发生的事情完全不同。过程是

  • 用户选择一个gridview项目
  • 它会将其重定向到更新页面,并使用DataReader,填充文本框和基于URL
  • 用户可以通过再ID复选框对文本框/复选框进行更改,然后按运行更新查询的更新按钮。

我所发现的情况是,尽管用户可能更改文本,当他们提交更改,更新查询仍在使用任何被加载到页面加载的数据读取该文本框。这是下面的代码:

Protected Sub SubmitBTN_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles UpdateBTN.Click 
     Dim tiresdim As Integer = 0 
     If TiresCHK.Checked = True Then 
      tiresdim = -1 
     ElseIf TiresCHK.Checked = False Then 
      tiresdim = 0 
     End If 
     Dim repairs As Integer = 0 
     If RepairsCheckBX.Checked = True Then 
      repairs = -1 
     ElseIf RepairsCheckBX.Checked = False Then 
      repairs = 0 
     End If 
     Dim onlotdim As Integer = 0 
     If OnLotCheckBX.Checked = True Then 
      onlotdim = -1 
     ElseIf OnLotCheckBX.Checked = False Then 
      onlotdim = 0 
     End If 
     Dim offpropdim As Integer = 0 
     If OffPropertyCheckBX.Checked = True Then 
      offpropdim = -1 
     ElseIf OffPropertyCheckBX.Checked = False Then 
      offpropdim = 0 
     End If 
     Dim soldim As Integer = 0 
     If SoldCheckBX.Checked = True Then 
      soldim = -1 
     ElseIf SoldCheckBX.Checked = False Then 
      soldim = 0 
     End If 

     Dim id = CType(Request.QueryString("param1"), Integer) 


     Dim connection As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Jason\Desktop\UsedCarProductionSched\app_data\UsedCars.accdb;Persist Security Info=False;") 
     Dim sql As String = "update Master set stocknum='" & StockNumTxt.Text & "',[year]='" & YearTxt.Text & "',make='" & MakeTxt.Text & "', model='" & ModelTxt.Text & "', color='" & ColorTxt.Text & "',location='" & LocationDropDownList.SelectedValue & "',tiresneeded=" & tiresdim & ",stockin=#" & StockInDateTxt.Text & "#,SvcRONum='" & SrvcROnumTxt.Text & "',ucistartdate=#" & UCIStartDateTxt.Text & "#,UCIEstCompleteDate=#" & UCIEstComDateTXT.Text & "#,repairs=" & repairs & ",CollisionRONum='" & CollisionRONumTXT.Text & "',[detail]=#" & DetailTXTbox.Text & "#, other='this has to work',onlot=" & onlotdim & ",offproperty=" & offpropdim & ",sold=" & soldim & " WHERE recnum=" & id 
     connection.Open() 

     Dim cmd As New OleDb.OleDbCommand(sql, connection) 

     cmd.ExecuteNonQuery() 
     connection.Close() 
     'Dim updateta As New DataSet1TableAdapters.Master1TableAdapter 
     'updateta.UpdateQuery(StockNumTxt.Text, YearTxt.Text, MakeTxt.Text, ModelTxt.Text, ColorTxt.Text, LocationDropDownList.SelectedValue, TiresCHK.Checked, StockInDateTxt.Text, SrvcROnumTxt.Text, UCIStartDateTxt.Text, UCIEstComDateTXT.Text, RepairsCheckBX.Checked, CollisionRONumTXT.Text, DetailTXTbox.Text, OtherTxt.Text, OnLotCheckBX.Checked, OffPropertyCheckBX.Checked, SoldCheckBX.Checked, Request.QueryString("param1")) 
     Response.Redirect("success.aspx") 
    End Sub 

    Function myCStr(ByVal test As Object) As String 
     If isdbnull(test) Then 
      Return ("") 
     Else 
      Return CStr(test) 
     End If 
    End Function 

    Public Shared Function IsDBNull(_ 
ByVal value As Object _ 
) As Boolean 
     Return DBNull.Value.Equals(value) 
    End Function 

    Private Sub getData(ByVal user As String) 
     'declare variables to fill 
     Dim stock As String, make As String, color As String, stockin As Date, ucistart As Date, repairs As Boolean, _ 
      tires As Boolean, onlot As Boolean, sold As Boolean, year As Boolean, model As String, location As String, srvcRO As String, ucicompldate As Date, _ 
      collRO As String, other As String, offprop As Boolean, detail As Date 

     Dim dt As New DataTable() 
     Dim connection As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Jason\Desktop\UsedCarProductionSched\app_data\UsedCars.accdb;Persist Security Info=False;") 
     connection.Open() 
     Dim sqlcmd As String = "SELECT * from Master WHERE RecNum = @recnum" 
     Dim FileCommand3 As New OleDb.OleDbCommand(sqlcmd, connection) 
     FileCommand3.Parameters.AddWithValue("@recnum", user) 
     Dim Reader3 As OleDb.OleDbDataReader = FileCommand3.ExecuteReader() 
     If Reader3.Read Then 

      stock = myCStr(Reader3("StockNum")) 
      make = myCStr(Reader3("Make")) 
      color = myCStr(Reader3("Color")) 
      stockin = IIf(Reader3("stockin") Is DBNull.Value, Nothing, Reader3("stockin")) 
      ucistart = IIf(Reader3("ucistartdate") Is DBNull.Value, Nothing, Reader3("ucistartdate")) 
      repairs = Reader3("Repairs") 
      tires = Reader3("tiresneeded") 
      onlot = Reader3("onlot") 
      sold = Reader3("sold") 
      year = myCStr(Reader3("year")) 
      model = myCStr(Reader3("model")) 
      location = myCStr(Reader3("location")) 
      srvcRO = myCStr(Reader3("svcROnum")) 
      ucicompldate = IIf(Reader3("uciestcompletedate") Is DBNull.Value, Nothing, Reader3("uciestcompletedate")) 
      collRO = myCStr(Reader3("collisionROnum")) 
      other = myCStr(Reader3("other")) 
      offprop = Reader3("offProperty") 
      detail = IIf(Reader3("detail") Is DBNull.Value, Nothing, Reader3("detail")) 

     End If 
     connection.Close() 

     If detail <> Nothing Then 
      DetailTXTbox.Text = detail.ToString("M/dd/yyyy") 
     Else : DetailTXTbox.Text = "" 
     End If 
     If ucicompldate <> Nothing Then 
      UCIEstComDateTXT.Text = ucicompldate.ToString("MM/dd/yyyy") 
     Else : UCIEstComDateTXT.Text = "" 
     End If 

     If stockin <> Nothing Then 
      StockInDateTxt.Text = stockin.ToString("MM/dd/yyyy") 
     Else : StockInDateTxt.Text = "" 
     End If 
     If ucistart <> Nothing Then 
      UCIStartDateTxt.Text = ucistart.ToString("M/dd/yyyy") 
     Else : UCIStartDateTxt.Text = "" 
     End If 
     StockNumTxt.Text = stock 
     MakeTxt.Text = make 
     ColorTxt.Text = color 
     RepairsCheckBX.Checked = repairs 
     TiresCHK.Checked = tires 
     OnLotCheckBX.Checked = onlot 
     SoldCheckBX.Checked = sold 
     YearTxt.Text = year 
     ModelTxt.Text = model 
     If location <> Nothing Then 
      LocationDropDownList.SelectedValue = location 
     End If 
     SrvcROnumTxt.Text = srvcRO 
     CollisionRONumTXT.Text = collRO 
     OtherTxt.Text = other 
     OffPropertyCheckBX.Checked = offprop 
    End Sub 

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
     getData(Request.QueryString("param1")) 
    End Sub 

我的asp.net应用程序应该执行针对访问数据库的简单更新查询,而是它抛出一个语法错误。我有复制并直接将确切的查询粘贴到我的访问数据库中,并正确执行。这里是代码:

Dim connection As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Jason\Desktop\UsedCarProductionSched\app_data\UsedCars.accdb;Persist Security Info=False;") 
    Dim sql As String = "update Master " _ 
          + "set stocknum='" & StockNumTxt.Text & "',year='" & YearTxt.Text & "',make='" & MakeTxt.Text & "', model='" & ModelTxt.Text & "', color='" & ColorTxt.Text & "',location='" & LocationDropDownList.SelectedValue & "',tiresneeded=" & tiresdim & ",stockin=#" & StockInDateTxt.Text & "#,SvcRONum='" & SrvcROnumTxt.Text & "',ucistartdate=#" & UCIStartDateTxt.Text & "#,UCIEstCompleteDate=#" & UCIEstComDateTXT.Text & "#,repairs=" & repairs & ",CollisionRONum='" & CollisionRONumTXT.Text & "',detail=#" & DetailTXTbox.Text & "#, other='" & OtherTxt.Text & "',onlot=" & onlotdim & ",offproperty=" & offpropdim & ",sold=" & soldim & " " _ 
          + "WHERE recnum=" & Request.QueryString("param1") 
    connection.Open() 

    Dim cmd As New OleDb.OleDbCommand(sql, connection) 
    cmd.ExecuteNonQuery() 
    connection.Close() 
+0

能否请您发布确切的SQL查询要运行,所以我可以比较 –

+0

从即时窗口在调试复制,这是SQL查询它正试图运行: '更新主 集stocknum =“1” ,year ='True',make ='1',model ='1',color ='1',location ='选择位置...”,tiresneeded = -1,stockin =#06/01/2011#,SvcRONum = '1',ucistartdate =#5/10/2011#,UCIEstCompleteDate =#7月9日/ 2011#,修理= -1,CollisionRONum = '1',detail =#7/09/2011#,other ='THIS WORKSSSSSSSSS',onlot = -1,offproperty = -1,sold = -1 WHERE recnum = 15“ ' – JDV590

+0

UPDATE语句在您的评论在最后包含一个流浪的双引号,这实际上是声明的一部分吗? – HansUp

回答

1

什么是语法错误?此外,在将其引入数据库更新之前,您应该验证SQL的输入。如果在文本中有撇号会导致问题。参数化查询也会更理想。

+0

我已经包括的整个错误细节部分: System.Data.OleDb.OleDbException是由用户代码未处理 错误码= -2147217900 消息=语法错误UPDATE语句。来源= Microsoft Office Access数据库引擎 – JDV590

+0

您肯定地表示您提供的声明在Access中执行时运行正常吗? – Alban

+1

您应该向HansUp提供您的答案,并将您的新问题作为单独问题发布。 – Alban

2

你的两列使用保留字作为他们的名字:年;详情。如果您必须保留这些名称,请将它们放在UPDATE语句的方括号中以避免混淆Access数据库引擎的可能性。

什么数据类型是年份字段?在你的评论中完成的声明包括year ='True'如果“year”是文本数据类型,那很好。但是,如果它是“是/否”字段,则会丢失“True”字样的引号。

+0

好的...年份是字符串数据类型。我认为这是一个输入错误,但它没有什么区别。 把括号解决了一个问题,但现在我有另一个问题。现在我得到这个错误: 'InvalidCastException的是由用户代码从字符串转换 未处理的“WHERE RECNUM =”键入“双师型”不valid.' IM假定它有什么做的字符串值,我请求从查询字符串与访问数据库的标识值不匹配 – JDV590

+0

请向我们显示产生该错误的当前UPDATE语句的确切文本。将它复制并粘贴为您的问题的编辑。同时告诉我们,当您在打开UsedCars.accdb的Access会话中将相同文本粘贴到SQL查看中时,会发生什么情况。 – HansUp

+0

.....请参阅上面的编辑 – JDV590

1

样品进行参数化的SQL操作,通过SkinnyWhiteNinja

的建议我有4个colunms表,CollCode和CollSeq是关键,TermType和TermText是修改的数据 的代码说明如何插入,更新或如果在SQL中有文本值,则删除一个参数为instaed的行。 该代码是只适用于ACCESS,SQL SERVER或MySQL需要为模板不同的代码,并且具有不同DbTypes

在程序的第一部分

:在程序的处理部

' Insert 
    Dim DbConn As New OleDbConnection(SqlProv) 
    Dim SQLTwInsert As String = "INSERT INTO SearchTerms (CollCode, CollSeq, TermType, TermText) VALUES (?, ?, ?, ?)" 
    Dim DRTwInsert As OleDbDataReader = Nothing 
    Dim DCCTwInsert As OleDbCommand 
    Dim TwInsP1 As New OleDbParameter("@CollCode", OleDbType.VarChar, 4) 
    Dim TwInsP2 As New OleDbParameter("@CollSeq", OleDbType.Integer, 4) 
    Dim TwInsP3 As New OleDbParameter("@TermType", OleDbType.VarChar, 4) 
    Dim TwInsP4 As New OleDbParameter("@TermText", OleDbType.VarChar, 255) 
    DCCTwInsert = New OleDbCommand(SQLTwInsert, DbConn) 
    DCCTwInsert.Parameters.Add(TwInsP1) 
    DCCTwInsert.Parameters.Add(TwInsP2) 
    DCCTwInsert.Parameters.Add(TwInsP3) 
    DCCTwInsert.Parameters.Add(TwInsP4) 

    ' Delete 
    Dim SQLTwDelete As String = "DELETE FROM SearchTerms WHERE CollCode = ? AND CollSeq = ? AND TermType = ? AND TermText = ?" 
    Dim DRTwDelete As OleDbDataReader = Nothing 
    Dim DCCTwDelete As OleDbCommand 
    Dim TwDelP1 As New OleDbParameter("@CollCode", OleDbType.VarChar, 4) 
    Dim TwDelP2 As New OleDbParameter("@CollSeq", OleDbType.Integer, 4) 
    Dim TwDelP3 As New OleDbParameter("@TermType", OleDbType.VarChar, 4) 
    Dim TwDelP4 As New OleDbParameter("@TermText", OleDbType.VarChar, 255) 
    DCCTwDelete = New OleDbCommand(SQLTwDelete, DbConn) 
    DCCTwDelete.Parameters.Add(TwDelP1) 
    DCCTwDelete.Parameters.Add(TwDelP2) 
    DCCTwDelete.Parameters.Add(TwDelP3) 
    DCCTwDelete.Parameters.Add(TwDelP4) 

    ' Update 
    Dim SQLTwUpdate As String = "UPDATE SearchTerms SET TermType = ?, TermText = ? WHERE CollCode = ? AND CollSeq = ? AND TermType = ? AND TermText = ?" 
    Dim DRTwUpdate As OleDbDataReader = Nothing 
    Dim DCCTwUpdate As OleDbCommand 
    Dim TwUpdP1 As New OleDbParameter("@TermType", OleDbType.VarChar, 4) 
    Dim TwUpdP2 As New OleDbParameter("@TermText", OleDbType.VarChar, 255) 
    Dim TwUpdP3 As New OleDbParameter("@CollCode", OleDbType.VarChar, 4) 
    Dim TwUpdP4 As New OleDbParameter("@CollSeq", OleDbType.Integer, 4) 
    Dim TwUpdP5 As New OleDbParameter("@oldTermType", OleDbType.VarChar, 4) 
    Dim TwUpdP6 As New OleDbParameter("@oldTermText", OleDbType.VarChar, 255) 
    DCCTwUpdate = New OleDbCommand(SQLTwUpdate, DbConn) 
    DCCTwUpdate.Parameters.Add(TwUpdP1) 
    DCCTwUpdate.Parameters.Add(TwUpdP2) 
    DCCTwUpdate.Parameters.Add(TwUpdP3) 
    DCCTwUpdate.Parameters.Add(TwUpdP4) 
    DCCTwUpdate.Parameters.Add(TwUpdP5) 
    DCCTwUpdate.Parameters.Add(TwUpdP6) 

' Update 
        TwUpdP1.Value = new value TermType 
        TwUpdP2.Value = new value TermText 
        TwUpdP3.Value = key value CollCode 
        TwUpdP4.Value = key value CollSeq 
        TwUpdP5.Value = old value TermType to avoid updating a row that 1 millisecond earlier was modified by someone else 
        TwUpdP6.Value = old value TermText 
        Try 
         DRTwUpdate = DCCTwUpdate.ExecuteReader() 
        Catch ex As Exception 
         your type of report exception 
        Finally 
         If Not (DRTwUpdate Is Nothing) Then 
          DRTwUpdate.Dispose() 
          DRTwUpdate.Close() 
         End If 
        End Try 

    ' Insert 
        TwInsP1.Value = new key value CollCode 
        TwInsP2.Value = new key value CollSeq 
        TwInsP3.Value = value TermType 
        TwInsP4.Value = value TermText 
        Try 
         DRTwInsert = DCCTwInsert.ExecuteReader() 
        Catch ex As Exception 
         your type of report exception 
        Finally 
         If Not (DRTwInsert Is Nothing) Then 
          DRTwInsert.Dispose() 
          DRTwInsert.Close() 
         End If 
        End Try 
    ' Delete 
        TwDelP1.Value = key value CollCode 
        TwDelP2.Value = key value CollSeq 
        TwDelP3.Value = old value TermType to avoid deleting a row that 1 millisecond earlier was modified by someone else 
        TwDelP4.Value = old value TermText 
        Try 
         DRTwDelete = DCCTwDelete.ExecuteReader() 
        Catch ex As Exception 
         your type of report exception 
        Finally 
         If Not (DRTwDelete Is Nothing) Then 
          DRTwDelete.Dispose() 
          DRTwDelete.Close() 
         End If 
        End Try 

尝试一下,它真的可以避免很多问题,尽管编写起来有点麻烦。