2011-07-14 10 views
0

編集:asp.netアプリケーションでクエリの構文が正しくありません

この問題は変更されました。 HansUpはupdate文でこの構文の問題を解決しました。今起こっていることはまったく異なっている。プロセスが

  • ユーザーが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アプリケーションは、アクセスDBに対する簡単な更新クエリを実行することになってではなく、それは構文エラーがスローされます。正確なクエリをコピーして自分のアクセスDBに直接貼り付け、適切に実行します。コードは次のとおりです。

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 = '場所を選択...UCIEstCompleteDate =#07/09/2011#、修理= -1、CollisionRONum = -1、在庫番号= -1、在庫=#06/01/2011#、SvcRONum = '1'、ucistartdate = '1'、detail =#7/09/2011#、other = 'このWORKSSSSSSSS'、onlot = -1、offproperty = -1、売却= -1 WHERE recnum = 15 " – JDV590

+0

コメントの中のそのUPDATEステートメント – HansUp

答えて

1

構文エラーは何ですか?また、データベースの更新プログラムにSQLを投入する前に、SQLの入力を検証する必要があります。テキストにアポストロフィがあると問題が発生します。パラメータ化されたクエリもより理想的です。

+0

:。 System.Data.OleDb.OleDbExceptionは、ユーザーコードによって未処理だった のErrorCode = -2147217900 UPDATE文でメッセージ=構文エラー。Source = Microsoft Office Accessデータベースエンジン – JDV590

+0

そして、あなたが提供したステートメントがAccessで実行されたときにうまく動作することは確かですか? – Alban

+1

あなたは答えをHansUpに与えて、新しい問題を別の質問として投稿してください。 – Alban

2

2つの列は、予約語を名前として使用します。詳細。それらの名前を保持する必要がある場合は、Accessのデータベースエンジンを混乱させる可能性を避けるために、UPDATEステートメントの角括弧で囲んでください。

年フィールドはどのデータ型ですか?あなたのコメントの完成した声明には年= 'True'が含まれています。「year」がテキストデータタイプの場合は問題ありません。しかし、それがYes/Noフィールドの場合、Trueという言葉の引用符を消してください。 SkinnyWhiteNinja

によって示唆されるようにパラメータ化されたSQL操作の

+0

Ok ...年は文字列データ型です。それは本当のことを言うために私の部分に入力エラーだったが、それは違いを作ることはありません。 ブラケットを入れて1つの問題を解決しましたが、今は別の問題があります。 'InvalidCastExceptionはユーザコードによって処理されていません 文字列「WHERE recnum =」から「Double」を入力すると有効ではありません。 私はそれが私が要求している文字列値と関係があると仮定していますアクセスDBのID値と一致しないクエリ文字列から – JDV590

+0

そのエラーを生成している現在のUPDATE文の正確なテキストを表示してください。質問を編集してコピー&ペーストしてください。また、同じテキストをUsedCars.accdbが開いているAccessセッションで新しいクエリのSQLビューに貼り付けるとどうなるか教えてください。 – HansUp

+0

.....上記の編集を参照してください – JDV590

1

サンプル、I 4 colunms持つテーブルを持っている、CollCodeとCollSeqキーであり、TermTypeとTermTextは修正データで コードを挿入する方法を説明し、更新またはSQLのtextvaluesの場合は、パラメータがinstaedの行を削除します。 コードはアクセスのみ有効で、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 

それを試してみてくださいビットclumbsyはそれをすべてを書くことが、それは実際に、多くの問題を回避することができます。

関連する問題