2

アクセスDBに、パイプ( "|")文字を含む文字列を格納する"OperationDesc"というフィールドを持つレコードセットがあります。VBA SQLメソッドを使用してレコードセットを検索し、パイプ文字を含む特定の文字列を特定するたびに、エラー3077「式での垂直バーの使用が無効です。

エラーを引き起こすセクションは次のとおりです。

Set dbs = CurrentDb
qr = "SELECT * FROM [A500Constants] ORDER BY [A500Constants].[ID];"
Set rs = dbs.OpenRecordset(qr)
qr = "[A500Constants].[ID] = " & Me.Controls("AddRoutDesc" & spot).Value
**rs.FindFirst qr**

If rs.Fields("ID") = 1 And Not rs.Fields("OperationDesc") = Me.Controls("AddRoutDesc" & CStr(spot)).Value Then
    'If true at start of rs when not suppose to be - signifies new entry time
    'if Me.Controls("AddRoutDesc" & CStr(Spot)).Value returned a description rather than ID the If would evaluate properly for the 1st item on the routing too
    'beginning process of validating new operation data

Me.Controls( "AddRoutDesc"&spot).Valueが|を含む文字列である場合、プログラムは"rs.FindFirstqr"でバグアウトします。パイプ文字。

これがやろうとしていること: 命名規則AddRoutDesc0、AddRoutDesc1、....のコンボボックスはn個あり、そこからユーザーが任意のテキストを入力できるようにしています。コンボボックスを離れるときに、「OperationDesc」というタイトルの列でテーブル/レコードセットを検索して、この説明が以前に使用されたことがあるかどうかを確認します。(私は現在IDを検索していることを知っています-複数列のコンボボックス間の競合のb / cと同時にユーザーが新しい説明を入力できるようにする唯一の方法であるため、OperationDescフィールドで検索したいと思いますリストプロパティへのリンク。)コンボボックスには、選択可能な事前の説明が入力されており、その一部にはパイプがあります。キャラクター。このエラーは、そのような説明を選択し、上記を実行するコンボボックスを離れるときに発生します。もっと簡単な方法があれば-私はSQLにパイプを文字列の単なる別の部分として表示させる方法、それは完璧でしょう。

現在、次のコードを用意しており、|を検索するために機能します。(または実際には何でも)そしてそれをいくつかの追加の区切り文字とパイプに置き換えて、SQLでw/eにフラグを立てないようにします。

Private Function SQLStringFixer(InputString As String, ByVal FindString As String, ByVal ReplacementString As String, ByVal CompType As Integer) As String
   If Not IsNull(InputString) Then
        Dim WorkingStr As String
        Dim Pntr As Integer

        WorkingStr = InputString
        Pntr = InStr(1, WorkingStr, FindString, CompType)

        Do While Pntr > 0
            WorkingStr = Left(CStr(WorkingStr), CLng(Pntr - 1)) & ReplacementString & Mid(WorkingStr, Pntr + Len(FindString))
            Pntr = InStr(Pntr + Len(ReplacementString), WorkingStr, FindString, CompType)
        Loop
        SQLStringFixer = WorkingStr
    Else
        SQLStringFixer = ""
    End If
End Function

Private Function FixStr4JetSQL(InputString As String) As String
     Dim Temp As String
     Temp = SQLStringFixer(InputString, "'", "''", vbBinaryCompare)
     FixStr4JetSQL = SQLStringFixer(Temp, "|", "' & chr(124) & '", vbBinaryCompare)
End Function

最終的には、SQLのクエリで|が表示される文字または文字のセットを知る必要があります。パイプとしてのパイプであり、w/eを行うためのいくつかのキーシンボルではありません。誰かがこれが何であるかを知っているなら-それは大きな助けになるでしょう-そのような些細な事柄は私にとても多くの時間を費やしました。

4

1 に答える 1

2

がパイプ文字を含む文字列であるrs.FindFirst qr場合、プログラムはバグアウトします。Me.Controls("AddRoutDesc" & spot).Value|

数字以外の何かを含む文字列や のような SQL キーワードに対して機能するかどうかはわかりませんNULL

Me.Controls("AddRouteDesc" & spot).Valueが含まれているかどうかを検討してくださいiamastringwithoutapipe。この線:

qr = "[A500Constants].[ID] = " & Me.Controls("AddRoutDesc" & spot).Value

次と同等です。

qr = "[A500Constants].[ID] = " & "iamastringwithoutapipe"

次と同等です。

qr = "[A500Constants].[ID] = iamastringwithoutapipe"

正しいステートメントは次のようになると思います。

qr = "[A500Constants].[ID] = '" & Me.Controls("AddRoutDesc" & spot).Value & "'"

これは次と同等です:

qr = "[A500Constants].[ID] = 'iamastringwithoutapipe'"

全体として、FindFirstこのように使用することは非常に壊れやすいです。おそらく、いくつかのパラメーター化されたクエリを作成するか、Access を使用しない方がよいでしょう。

于 2013-01-30T10:45:26.970 に答える