2012-02-17 24 views
0

私はMicrosoft AccessとVBの全く新しいです。私はボタンをクリックすると無制限のテキストボックスを持つフォームを持っています。一意のフィールド。Microsoft Access 2010 VB InsertInto構文エラー

私はこのコードをオンラインリソースの助けを借りて書くことができましたが、誰かが私に正しい方法を教えてもらえれば構文エラーが出てきます。

CurrentDb.Execute "INSERT INTO UserInformation(" & _ 
    "FirstName, LastName, Company, JobTtile, PhoneNumber, Mobile, Email, Fax, " & _ 
    "IT-DEC-MAKER-FNAME, IT-DEC-MAKER-LNAME) " & _ 
    "VALUES('" & Me.qfirstname & "','" & Me.qlastname & "','" & Me.qcompany & "','" & _ 
    Me.qjob & "','" & Me.qphone & "','" & Me.qmobile & "','" & Me.qemail & "','" & _ 
    Me.qfax & "','" & Me.qitfirstname & "','" & Me.qitlastname & "');" 
+0

バインドされたフォームでも、保存ボタンを使用できますか? save me.dirty = false –

+0

決して決して**このような文字列連結を使用してSQLクエリを構築しないでください。あなたはハッキングするように自分自身を設定しています。 –

答えて

2

IT-DEC-MAKER-FNAMEIT-DEC-MAKER-LNAMEはSQLで無効な識別子ですされているので、あなたは括弧で([])を囲む必要があり

CurrentDb.Execute "INSERT INTO UserInformation(" & _ 
    "FirstName, LastName, Company, JobTtile, PhoneNumber, Mobile, Email, Fax, " & _ 
    "[IT-DEC-MAKER-FNAME], [IT-DEC-MAKER-LNAME]) " & _ 
    "VALUES('" & Me.qfirstname & "','" & Me.qlastname & "','" & Me.qcompany & "','" & _ 
    Me.qjob & "','" & Me.qphone & "','" & Me.qmobile & "','" & Me.qemail & "','" & _ 
    Me.qfax & "','" & Me.qitfirstname & "','" & Me.qitlastname & "');" 

UPDATE

私は2つの素敵なヘルパーを持っていますこの種のもののための機能。

この1つはであなたは、このようにそれらを使用することができます

Public Function SqlStr(ByVal v As Variant) As String 
    ' NULL Returns: NULL 
    ' ""  Returns: NULL 
    ' "abc" Returns: 'abc' 
    ' "x'y" Returns: 'x''y' 

    Dim s As String 

    s = Nz(v) 
    If s = "" Then 
     SqlStr = "NULL" 
    Else 
     SqlStr = "'" & Replace(s, "'", "''") & "'" 
    End If 
End Function 

SQL値にこの1つはテキストを含むことになっバリアント値を変換し

Function Build(ByVal s As String, ParamArray args()) As String 
    ' Build("LastName = {0}, FirstName = {1}","Dow","John") --> "LastName = Dow, FirstName = John". 
    ' "\n" will be converted to vbCrLf. 

    Dim i As Long 

    s = Replace(s, "\n", vbCrLf) 
    For i = 0 To UBound(args) 
     s = Replace(s, "{" & i & "}", Nz(args(i))) 
    Next i 
    Build = s 
End Function 

値を持つ文字列内のプレースホルダを置き換えますコードをより安全で分かりやすくします。

Dim template As String, sql As String 

template = "INSERT INTO UserInformation(" & _ 
    "FirstName, LastName, Company, JobTtile, PhoneNumber, Mobile, Email, Fax, " & _ 
    "[IT-DEC-MAKER-FNAME], [IT-DEC-MAKER-LNAME]) " & _ 
    "VALUES({0},{1},{2},{3},{4},{5},{6},{7},{8},{9});" 
sql = Build(template, _ 
    SqlStr(Me.qfirstname), SqlStr(Me.qlastname), _ 
    SqlStr(Me.qjob), SqlStr(Me.qphone), _ 
    SqlStr(Me.qmobile), SqlStr(Me.qemail), _ 
    SqlStr(Me.qfax), SqlStr(Me.qitfirstname), _ 
    SqlStr(Me.qitlastname)) 
CurrentDb.Execute sql 
+0

大変ありがとうございます、大括弧で囲んでいただきありがとうございます:) – aminet91

1

私はそうのようにあなたのコードをレイアウト勧め:

sSQL = "INSERT INTO UserInformation(" _ 
& "FirstName, LastName, Company, JobTtile, " _ 
& "PhoneNumber, Mobile, Email, Fax, " _ 
& "IT-DEC-MAKER-FNAME, IT-DEC-MAKER-LNAME) " _ 
& "VALUES('" _ 
& Me.qfirstname & "','" & Me.qlastname & "','" & Me.qcompany & "','" & Me.qjob _ 
& "','" & Me.qphone & "','" & Me.qmobile & "','" & Me.qemail & "','" & Me.qfax _ 
& "','" & Me.qitfirstname & "','" & Me.qitlastname & "');" 

CurrentDB.Execute sSQL, dbFailOnError 

それはそれがはるかに簡単にミスを見になり、SSQL文字列はデバッグのためイミディエイトウィンドウに印刷することができます。 JobTtileがあることがわかります。

CurrentDBのインスタンスを使用することは通常より良いです:

Dim db As DAO.Database 
Set db = CurrentDB 

あなただけのレコードセットを結合しない、なぜかしら?

+0

これは、コードを分割するのに最適な方法です。ありがとうございます – aminet91

関連する問題