VBA插入ADO参数

问题描述:

我正在ACCESS VBA中工作。我有一个子集,它将给定的集合插入到不同的表中,这取决于当前的元素。我刚认识并希望与这个ADO参数一起工作,因为我对简单的docmd.runsql "insert into..."有问题。问题是有些字符串包含“'”字符,所以我在这些记录中出错。我搜索并找到了ADO参数,但是没有很好的教程,现在我厌倦了无用的错误代码(来自java)。 我的代码片段:VBA插入ADO参数

Dim adoCMD As Object 
Set adoCMD = CreateObject("ADODB.Command") 
With adoCMD 
    .ActiveConnection = CurrentProject.Connection 
    .CommandType = adCmdText 
    .parameters.Append .CreateParameter("pKey", adInteger) 
    .parameters.Append .CreateParameter("pTitle", adVarChar, 100) 
    .parameters.Append .CreateParameter("pid", adInteger) 
    .parameters.Append .CreateParameter("pAired", adDate) 
    .parameters.Append .CreateParameter("pmtype", adInteger) 
    .parameters.Append .CreateParameter("pSyear", adSmallInt) 
    .parameters.Append .CreateParameter("pSeason", adInteger) 
    If addDate Then 
     .parameters.Append .CreateParameter("pAdded", adDate) 
    End If 
    For Each elem In ac 
     If elem.aired >= seasonStart And elem.aired <= seasonEnd Then 
      key = Nz(DMax("table_Akey", "table_A"), 0) + 1 
      .parameters("pKey").Value = key 
      .parameters("pTitle").Value = elem.title 
      .parameters("pid").Value = elem.id 
      .parameters("pAired").Value = elem.aired 
      .parameters("pmtype").Value = elem.mtype 
      .parameters("pSyear").Value = syear 
      .parameters("pSeason").Value = season 
      If addDate Then 
       .parameters("pAdded").Value = Date 
       .CommandText = "INSERT INTO table_A(table_Akey,title,id,aired,media,seasonyear,season,added) VALUES(pKey,pTitle,pid,pAired,pmtype,pSyear,pSeason,pAdded);" 
      Else 
       .CommandText = "INSERT INTO table_A(table_Akey,title,id,aired,media,seasonyear,season) VALUES(pKey,pTitle,pid,pAired,pmtype,pSyear,pSeason);" 
      End If 
     Else 
      wCounter = wCounter + 1 
      key = Nz(DMax("wskey", "ws"), 0) + 1 
      .parameters("pKey").Value = key 
      .parameters("pTitle").Value = elem.title 
      .parameters("pid").Value = elem.id 
      .parameters("pAired").Value = elem.aired 
      .parameters("pmtype").Value = elem.mtype 
      .parameters("pSyear").Value = syear 
      .parameters("pSeason").Value = season 
      .CommandText = "INSERT INTO ws(wskey,title,id,aired,media,wsyear,season) VALUES(pKey,pTitle,pid,pAired,pmtype,pSyear,pSeason);" 
     End If 
     .Execute 
    Next elem 
End With 

我得到的错误:运行时错误“3001”参数的错误类型,超出可接受的范围或者是彼此 冲突在该行

.parameters.Append .CreateParameter("pTitle", adVarChar, 100) 

也许整个代码是错误的,我不知道如何正确处理ADO参数,但是你可以看到我想要做的事情。我给这个函数一个集合。我遍历元素并将它们放在正确的表格中,并且还有一个开关(addDae)。

请帮帮我。

+0

一般来说,如果你”重新使用ODBC提供程序时,SQL语句中的参数以'?'作为占位符而不是参数名称:'VALUES(?,?,?,?,?,?,?)'。我也很肯定你不能像这样使用'pAdded'这样的“可选”参数 - 参数的数量必须与'CommandText'匹配。 – Comintern

+0

@Comintern每次参数的数量都会匹配。无论如何,尝试没有它,仍然在同一条线上得到相同的错误。关于'VALUES(?,?,?,?,?,?,?)'事情:我应该如何分配循环中的值? '.parameters( “?”)。值='。目前一般不工作。你只是写了一篇评论,而没有仔细看看我的代码和想法。毫无帮助。 :(对不起,如果我很苛刻,但我尝试了很多东西 – junpet

您也可以编写一个函数来转义DB单引号。一般来说,单引号是通过加倍而“逃脱”的。这将是这样的:

Function escapeDBquote(s As String) As String 
    Dim sOut As String 
    Dim i As Integer 
    i = 1 
    While (i <= len(s)) 
     If (Mid(s, i, 1) = "'") Then sOut = sOut +"'" 
     sOut = sOut + Mid(s, i, 1) 
     i = i + 1 
    Wend 
    escapeDBquote = sOut 
End Function 

,并调用它像:

Dim szSQL As String 
szSQL = "insert into myTable (sfield1, ..) values ('" + escapeDBquote(myString) + "');" 

(注:没有编译的代码;可能会出现一些错别字)

+0

工作就像一个魅力!谢谢!我也有一些类似的问题在我的工作以及(我想插入一些'双'用十进制逗号' '像3,14159),但我得到错误,没有匹配的参数数字。我很好奇,你有一些想法吗?:D这真的很痛苦连接一个长'INSERT INTO'的屁股,所以我会喜欢看如何用ADO参数解决我原来的帖子,无论如何,我给你一个很好的绿色的东西^^ – junpet

+0

Junpet,大多数编程语言和数据库系统都是面向英文的,并且不使用逗号作为十进制分隔符使用小数点注意,例如,Excel可以用逗号作为小数点分隔符显示数字,但这只是_presentation_。在内部,它只是作为浮点数存储。 –

+0

我住在这样一个国家,我们使用十进制逗号,而不是一个点,当我在VBA中进行一些计算时,将它存储为一个s'double',如果我称这个变量为3,14159。我能做什么?我的VBA使用十进制逗号,但我的ACCESS DB使用'INSERT INTO'命令带小数点(我可以在结果集中看到十进制逗号)。真令人沮丧。清除:我想插入'double'变量,像''INSERT INTO table_A(xy)VALUES(“&doubleVariable & ");”所以,这不仅仅是演示文稿,当我的代码在此时IMO失败。 – junpet