【问题标题】:VBA ADO SQL too few parametersVBA ADO SQL 参数太少
【发布时间】:2018-07-27 14:24:08
【问题描述】:

我之前问过这个问题,但我仍然卡住,无法将参数放入 SQL 查询中。

Public Function testInsert(tableName As String, dType As String, role As String, 
FiscalYear As String)
  Dim cmd As ADODB.Command
  Dim conn As ADODB.connection
  Dim prm As ADODB.Parameter
  Dim connectionString As String
  Dim SQL As String

  Set conn = New ADODB.connection
  Set cmd = New ADODB.Command

  DBPath = "path\to\file.xlsm"
  connectionString = "Provider=MSDASQL.1;DSN=Excel Files;DBQ=" & DBPath &";HDR=Yes';"
  SQL = "INSERT INTO [" & tableName & "$] ([Year], [Type], [role]) VALUES (p1, p2, p3)"

  'Open connection
  conn.Open connectionString

  'Set command text
  cmd.CommandText = SQL
  cmd.CommandType = adCmdText

  'Set connection
  cmd.ActiveConnection = conn

  'Set paramters in SQL query
  Set prm = cmd.CreateParameter("p1", adInteger, adParamInput)
  cmd.Parameters.Append prm
  cmd.Parameters("p1").Value = 1

  Set prm = cmd.CreateParameter("p2", adInteger, adParamInput)
  cmd.Parameters.Append prm
  cmd.Parameters("p2").Value = 2

  Set prm = cmd.CreateParameter("p3", adInteger, adParamInput)
  cmd.Parameters.Append prm
  cmd.Parameters("p3").Value = 3

  cmd.Execute
  conn.Close

 End Function

我在 excel-2010 中使用 VBA,并且正在对我计算机上的外部 excel 文件运行查询。我得到的参数太少,预计会出现三个错误。

请注意,如果值是字符串文字,则此代码有效,因此问题出在参数上。

【问题讨论】:

    标签: sql vba excel-2010


    【解决方案1】:

    你没有按照昨天的回复:(你不需要那个Prm变量,但是如果你使用它,那么你应该使用一个作为参数。

    Public Function testInsert(tableName As String, dType As String, role As String, 
    FiscalYear As String)
      Dim cmd As ADODB.Command
      Dim conn As ADODB.connection
      Dim prm1 As ADODB.Parameter
      Dim prm2 As ADODB.Parameter
      Dim prm3 As ADODB.Parameter
      Dim connectionString As String
      Dim SQL As String
    
      Set conn = New ADODB.connection
      Set cmd = New ADODB.Command
    
      DBPath = "path\to\file.xlsm"
      connectionString = "Provider=MSDASQL.1;DSN=Excel Files;DBQ=" & DBPath &";HDR=Yes';"
      SQL = "INSERT INTO [" & tableName & "$] ([Year], [Type], [role]) VALUES (?, ?, ?)"
    
      'Open connection
      conn.Open connectionString
    
      'Set command text
      cmd.CommandText = SQL
      cmd.CommandType = adCmdText
    
      'Set connection
      cmd.ActiveConnection = conn
    
      'Set paramters in SQL query
      Set prm1 = cmd.CreateParameter("@p1", adInteger, adParamInput)
      cmd.Parameters.Append prm1
      cmd.Parameters("@p1").Value = 1
    
      Set prm2 = cmd.CreateParameter("@p2", adInteger, adParamInput)
      cmd.Parameters.Append prm2
      cmd.Parameters("@p2").Value = 2
    
      Set prm3 = cmd.CreateParameter("@p3", adInteger, adParamInput)
      cmd.Parameters.Append prm3
      cmd.Parameters("@p3").Value = 3
    

    你根本不需要那些 prm1、prm2、prm3:

    'Set paramters in SQL query
    cmd.Parameters.Append cmd.CreateParameter("@p1", adInteger, adParamInput)
    cmd.Parameters.Append cmd.CreateParameter("@p2", adInteger, adParamInput)
    cmd.Parameters.Append cmd.CreateParameter("@p3", adInteger, adParamInput)
    
    cmd.Parameters("@p1").Value = 1
    cmd.Parameters("@p2").Value = 2
    cmd.Parameters("@p3").Value = 3
    

    【讨论】:

    • 这正是我所做的,我得到了同样的错误,期待三个参数
    • 当然可以,但我不能使用真实数据,如果可以的话,明天必须在我的个人电脑上使用?
    • @User,不,这周六不行。但是,如果您愿意,我可以在今天(东部标准时间下午 3 点至晚上 7 点)之间完成。
    【解决方案2】:

    名称参数以'@'开头,如@p1

    Public Function testInsert(tableName As String, dType As String, role As String, 
    FiscalYear As String)
      Dim cmd As ADODB.Command
      Dim conn As ADODB.connection
      Dim prm As ADODB.Parameter
      Dim connectionString As String
      Dim SQL As String
    
      Set conn = New ADODB.connection
      Set cmd = New ADODB.Command
    
      DBPath = "path\to\file.xlsm"
      connectionString = "Provider=MSDASQL.1;DSN=Excel Files;DBQ=" & DBPath &";HDR=Yes';"
      SQL = "INSERT INTO [" & tableName & "$] ([Year], [Type], [role]) VALUES (@p1, @p2, @p3)"
    
      'Open connection
      conn.Open connectionString
    
      'Set command text
      cmd.CommandText = SQL
      cmd.CommandType = adCmdText
    
      'Set connection
      cmd.ActiveConnection = conn
    
      'Set paramters in SQL query
      Set prm = cmd.CreateParameter("@p1", adInteger, adParamInput)
      cmd.Parameters.Append prm
      cmd.Parameters("@p1").Value = 1
    
      Set prm = cmd.CreateParameter("@p2", adInteger, adParamInput)
      cmd.Parameters.Append prm
      cmd.Parameters("@p2").Value = 2
    
      Set prm = cmd.CreateParameter("@p3", adInteger, adParamInput)
      cmd.Parameters.Append prm
      cmd.Parameters("@p3").Value = 3
    
      cmd.Execute
      conn.Close
    
     End Function
    

    【讨论】:

    • 好的,但不是它说参数太少,需要三个。
    • 为每个参数命名不同的名称,例如 prm1、prm2、prm3
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多