2016-05-11 17 views
1

データをテーブルに追加しているため、データからレポートまたはラベルを印刷できます。データはアドレスで構成されており、アドレスのカンマのために文字列が失われています。この文字列は動作していますが、何らかの奇妙なアドレスがある場合、これが原因です。VBA SQL文字列ランタイムエラー3075

sqls = "INSERT INTO tInvReportDataWrk(SO,ITEM,QTY,billTO,shipTO,LINEKEY)VALUES('" & 
    SO & "', '" & it & "', '" & qty & "', '" & billTO & "', '" & shipTO & "', '" & lk & "')" 

問題は "O'TOOL" で「(アポストロフィ)によるものであるdebug.print

INSERT INTO tInvReportDataWrk(SO,ITEM,QTY,billTO,shipTO,LINEKEY) 
VALUES('0000001', 'L-R_4-8R2B-01', '2', 'BAR - ANAHEIM 
BAR BRANCH 
P.O. BOX 00000 
VENDOR ID# VC-00001 
Saint Louis, MO 00008 
', 'ABC ELEMENT WAREHOUSE 
2000 O'TOOL AVE. 
San Jose, CA 95131-1301 
', '000001') 
+1

プリペアドステートメントを、あなたはあなたの文字列を構築する際に考慮に特殊文字を取る必要がないためにも、あなたを助けるかもしれません。このサンプルが役立つかどうかを確認してください。 http://stackoverflow.com/questions/6572448/ms-access-prepared-statements – Jeremy

答えて

1

アドレスのコンマが問題であるかどうかは不明です。それは私にアポストロフィのように見えるO'TOOLが問題になるはずです。しかし、それが最初のエラーの原因ではない場合、アクセスが不平を言って、それは最初のエラーを修正した後に別のエラーを引き起こすはずです。

単純な例として、次のコードはエラー3075,"クエリ式の構文エラー(演算子がありません)"; O ''; ''をトリガします。

Dim strInsert As String 
strInsert = "INSERT INTO tblFoo(text_field) VALUES ('O'TOOL');" 
CurrentDb.Execute strInsert, dbFailOnError 

これらのいずれかにINSERTステートメントを変更する文がエラーなしで実行することができます。

strInsert = "INSERT INTO tblFoo(text_field) VALUES ('O''TOOL');" 
strInsert = "INSERT INTO tblFoo(text_field) VALUES (""O'TOOL"");" 

これらのアプローチのいずれかを使用するようにコードを修正することができます。しかし、代わりにparameter queryまたはDAO.Recordset.AddNewメソッドを考えてみてください。その後、引用符とアポストロフィはあまり面倒ではありません。

+0

DAO Recordset AddNewを試してみることにしました。私は非常に滑らかなテーブルにデータを追加するとどれくらいいいのか信じられません。私は常にアポストロフィや引用符で苦労してきました。ご回答ありがとうございました。 – Kevin

+1

よろしくお願いいたします。私はまた、両方のパラメータクエリと 'Recordset.AddNew'が扱いやすい日付を作ることを好む---あなたはフォーマットの問題と'# 'デリミタを気にする必要はありません。 – HansUp

0

からこのようなルックスをしようとしているデータ。それをダブルアポストロフィ(O''TOOL)に置き換えるか、アドレスを二重引用符で囲みます。

+0

私はそれがおそらくコンマまたはアポストロフィであることを知っていました。私は引用符とコンマで苦労しました。あなたの返信ありがとう! – Kevin

1

はい、アポストロフィです。

あなたがSQLを連結するとき、このおよび他のほとんどのトラブルを避けるために、この機能を使用することができます

' Converts a value of any type to its string representation. 
' The function can be concatenated into an SQL expression as is 
' without any delimiters or leading/trailing white-space. 
' 
' Examples: 
' SQL = "Select * From TableTest Where [Amount]>" & CSql(12.5) & "And [DueDate]<" & CSql(Date) & "" 
' SQL -> Select * From TableTest Where [Amount]> 12.5 And [DueDate]< #2016/01/30 00:00:00# 
' 
' SQL = "Insert Into TableTest ([Street]) Values (" & CSql(" ") & ")" 
' SQL -> Insert Into TableTest ([Street]) Values (Null) 
' 
' Trims text variables for leading/trailing Space and secures single quotes. 
' Replaces zero length strings with Null. 
' Formats date/time variables as safe string expressions. 
' Uses Str to format decimal values to string expressions. 
' Returns Null for values that cannot be expressed with a string expression. 
' 
' 2016-01-30. Gustav Brock, Cactus Data ApS, CPH. 
' 
Public Function CSql(_ 
    ByVal Value As Variant) _ 
    As String 

    Const vbLongLong As Integer = 20 
    Const SqlNull  As String = " Null" 

    Dim Sql    As String 
    Dim LongLong  As Integer 

    #If Win32 Then 
     LongLong = vbLongLong 
    #End If 
    #If Win64 Then 
     LongLong = VBA.vbLongLong 
    #End If 

    Select Case VarType(Value) 
     Case vbEmpty   ' 0 Empty (uninitialized). 
      Sql = SqlNull 
     Case vbNull    ' 1 Null (no valid data). 
      Sql = SqlNull 
     Case vbInteger   ' 2 Integer. 
      Sql = Str(Value) 
     Case vbLong    ' 3 Long integer. 
      Sql = Str(Value) 
     Case vbSingle   ' 4 Single-precision floating-point number. 
      Sql = Str(Value) 
     Case vbDouble   ' 5 Double-precision floating-point number. 
      Sql = Str(Value) 
     Case vbCurrency   ' 6 Currency. 
      Sql = Str(Value) 
     Case vbDate    ' 7 Date. 
      Sql = Format(Value, " \#yyyy\/mm\/dd hh\:nn\:ss\#") 
     Case vbString   ' 8 String. 
      Sql = Replace(Trim(Value), "'", "''") 
      If Sql = "" Then 
       Sql = SqlNull 
      Else 
       Sql = " '" & Sql & "'" 
      End If 
     Case vbObject   ' 9 Object. 
      Sql = SqlNull 
     Case vbError   ' 10 Error. 
      Sql = SqlNull 
     Case vbBoolean   ' 11 Boolean. 
      Sql = Str(Abs(Value)) 
     Case vbVariant   ' 12 Variant (used only with arrays of variants). 
      Sql = SqlNull 
     Case vbDataObject  ' 13 A data access object. 
      Sql = SqlNull 
     Case vbDecimal   ' 14 Decimal. 
      Sql = Str(Value) 
     Case vbByte    ' 17 Byte. 
      Sql = Str(Value) 
     Case LongLong   ' 20 LongLong integer (Valid on 64-bit platforms only). 
      Sql = Str(Value) 
     Case vbUserDefinedType ' 36 Variants that contain user-defined types. 
      Sql = SqlNull 
     Case vbArray   ' 8192 Array. 
      Sql = SqlNull 
     Case Else    '  Should not happen. 
      Sql = SqlNull 
    End Select 

    CSql = Sql & " " 

End Function 
+0

返信いただきありがとうございます。この機能をデータベースに追加する方法を検討します。私はそれをより良く理解するためにそれをもっと理解する必要があります。 – Kevin

+0

それ以上の場合があります。それは本当に簡単です - インラインの例を参照してください。 – Gustav