使用INSERT从列表框中复制

时间:2017-05-12 11:27:07

标签: vba ms-access access-vba ms-access-2010

我允许我的用户在列表框中选择一个项目,然后单击一个按钮将数据放入其自己的表中。

这是我的代码:

Dim varItem As Variant
Dim strSQL As String

For Each varItem In Me.LettersDueList.ItemsSelected

    strSQL = "INSERT INTO tbl_OmbudsmanCompletedWorkTEST (CustomerAccountNumber, NoteTypeDescription, BusinessAreaDescription, NotePurposeCode, CSUserID, AdvisorName, Site) " _
                                    & "Values(" & Me.LettersDueList.Column(0, varItem) & ", " _
                                    & Me.LettersDueList.Column(1, varItem) & ", " _
                                    & Me.LettersDueList.Column(2, varItem) & ", " _
                                    & Me.LettersDueList.Column(3, varItem) & ", " _
                                    & Me.Text43.Value & "," _
                                    & Me.Text21.Value & "," _
                                    & Me.LettersDueList.Column(6, varItem) & ")"
    CurrentDb.Execute strSQL, dbFailOnError

Next

我的代码在此行调试:

& Me.LettersDueList.Column(1, varItem) & ", " _

错误:

Syntax Error (Missing Operator)

我出错的任何想法?

由于

1 个答案:

答案 0 :(得分:1)

看起来你在文本字段周围缺少单引号'',例如:
"'" & Me.LettersDueList.Column(1, varItem) & "', "

顺便说一句,你应该考虑StringFormat助手功能,它会让你的生活更轻松。

Public Function StringFormat(ByVal Item As String, ParamArray args() As Variant) As String

    Dim idx As Integer
    For idx = LBound(args) To UBound(args)
        Item = Replace(Item, "{" & idx & "}", args(idx))
    Next idx

    StringFormat = Item
End Function

您的SQL字符串将如下所示:

Dim varItem As Variant
Dim strSQL As String

For Each varItem In Me.LettersDueList.ItemsSelected
    strSQL = StringFormat("INSERT INTO tbl_OmbudsmanCompletedWorkTEST (CustomerAccountNumber, NoteTypeDescription, BusinessAreaDescription, NotePurposeCode, CSUserID, AdvisorName, Site) " & _
                          "VALUES('{0}','{1}','{2}','{3}','{4}','{5}','{6}');", _
                          Me.LettersDueList.Column(0, varItem), _
                          Me.LettersDueList.Column(1, varItem), _
                          Me.LettersDueList.Column(2, varItem), _
                          Me.LettersDueList.Column(3, varItem), _
                          Me.Text43.Value, _
                          Me.Text21.Value, _
                          Me.LettersDueList.Column(6, varItem))
    CurrentDb.Execute strSQL, dbFailOnError
Next

只需删除数字字段上的单引号'{0}'

尽管如此,我个人更喜欢参数化查询:

PARAMETERS [prm1] Text (255), [prm2] Text (255), [prm3] Text (255);
INSERT INTO YourTableName ( Field1, _Field2, Field3 )
SELECT [prm1], [prm2], [prm3];

...

With CurrentDb.QueryDefs("QueryName")
    .Parameters("[prm1]").Value = Value1
    .Parameters("[prm2]").Value = Value2
    .Parameters("[prm3]").Value = Value3
    .Execute dbFailOnError
End With

关于StringFormat函数

StringFormat是一个自定义辅助函数,它模仿C# String.Format()方法。

简化版本(如提供的版本)接受两个参数StringParamArray(),并通过替换String,{{1}返回连接的{0}使用指定索引处提供的参数。

所以在SQL字符串场景中:

{1}, ...

成为:

"FirstName='" & firstName_ & "' And LastName='" & lastname_ & "'"

您可以在此处详细了解"FirstName='{0}' And LastName='{1}'", firstName_, lastname_ 方法:https://msdn.microsoft.com/en-us/library/system.string.format(v=vs.110).aspx#Starting

上面引用的简化版本来自Rob Cooper和Michael Tucker撰写的 Expert Access 2007编程http://www.wrox.com/WileyCDA/WroxTitle/Expert-Access-2007-Programming.productCd-0470174021.html

最后,您可以在此处看到来自Mat的马克杯的完整实施:https://codereview.stackexchange.com/questions/30817/a-csharpish-string-format-formatting-helper/31000#31000