2014-01-09 45 views
0

我想从Access表中将变量/参数传递到SQL Server中的存储过程,使用ADODB连接。我拉动Access和Access访问查询中的变量(所以我试图传递每次执行代码时更新的变量)。尝试在Access VBA代码中传递下面的变量时出现以下错误消息:将参数从访问变量传递到SQL Server存储过程

参数对象定义不正确。提供了不一致或不完整的信息。

我是新来的这种编码。有人可以请提供一些指导如何将变量(Access查询的结果)传递给存储过程,然后在存储过程中调用这些变量?

访问VBA代码:

 '''CREATE LINKED TABLE THAT PULLS FROM TBL_STATEMENT_MASTER IN SQL 
     ''variables to pass to get dFileRE 
     '' (1) stateDate 
     stateDate = getItem("select distinct paydate from update_statement_master_re") 
     '' (2) stateNGN 
     stateNGN = getItem("select distinct deal_code from update_statement_master_re") 

      user = GetUser() 

     '' Connect to Data Source - Securities DB - SQL Server 
      Set dbconn = New ADODB.Connection 
      dbconn.ConnectionString = "driver=SQL Server;server=R7SQL1;database=SecuritiesDB;trusted_connection=YES" 
      dbconn.Open dbconn.ConnectionString 
      Set cmd = New ADODB.Command 
      cmd.ActiveConnection = dbconn 

     '' Set CommandText equal to the stored procedure name (spStatementCheck) 
      cmd.CommandType = adCmdStoredProc 
      cmd.CommandText = "spStatementCheck" 
      cmd.NamedParameters = True 'paramStatementCheck' 

'' THIS IS THE PART OF THE CODE THAT IS CRASHING – I AM NOT SURE HOW TO CALL THESE VARIABLES 
      cmd.Parameters.Append _ 
       cmd.CreateParameter("@SPstateNGN", adVarChar, adParamInput, 0, "& stateNGN &") 
      cmd.Parameters.Append _ 
       cmd.CreateParameter("@SPstateDate", adDate, adParamInput, 0, "& stateDate &") 

SQL Server存储过程的代码:

 USE [SecuritiesDB_TEST] 
     GO 
    SET ANSI_NULLS ON 
     GO 
    SET QUOTED_IDENTIFIER ON 
     GO 

    ALTER PROCEDURE [dbo].[spStatementCheck] 
    @SPstateNGN as nvarchar(25), 
    @SPstateDate as datetime 

     AS 

-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 


    -- Insert statements for procedure here 

     INSERT INTO UPDATE_Statement_Master_Check (NGN_Full, [Date], [DESCRIPTION], AMOUNT,  NGN_SHORT, Series, FileDate, EffectiveDate, ActualDate, [Source], ID) 
     SELECT tbl_Statement_Master.NGN_Full, tbl_Statement_Master.[Date], 
     tbl_Statement_Master.[DESCRIPTION], 
     tbl_Statement_Master.AMOUNT, 
     tbl_Statement_Master.NGN_SHORT, 
     tbl_Statement_Master.Series, 
     tbl_Statement_Master.FileDate, 
     tbl_Statement_Master.EffectiveDate, 
     tbl_Statement_Master.ActualDate, 
     tbl_Statement_Master.[Source], 
     tbl_Statement_Master.ID 
     FROM tbl_Statement_Master 
     where tbl_Statement_Master.[Date] <> @SPstateDate 
     and tbl_Statement_Master.NGN_Full = @SPstateNGN 
     and tbl_statement_master.FileDate = (Select distinct max(filedate) from tbl_statement_master 
     where [DATE] = @SPstateDate and NGN_Full = @SPstateNGN); 
+0

我可能会在这里丢失一些东西,但是'GetItem'行会返回多个值,并且您试图将这些多个值传递给'CreateParameter'调用。难道你不希望在那里有一个循环来遍历每条记录,并根据该记录中的参数值执行存储过程。 我不明白创建参数的''&&stateNGN&''部分。在过去,我只是将变量放在该参数中,而没有引号或符号。 –

+0

** GetItem **将只返回一个值。我使用了** stateNGN **和** stateDate **,因为每次代码执行时都需要更新这些变量,而不是对变量进行硬编码。 – user2989011

+0

“GetItem”指向的第二点是关于CreateParameter(“@ SPstateNGN”,adVarChar,adParamInput,0,stateNGN)',只是删除引号和&符号,因为变量中保存的任何值都作为参数值。 –

回答

1

当您尝试添加参数,你只需要自己变量传递到呼叫。

'' THIS IS THE PART OF THE CODE THAT IS CRASHING – I AM NOT SURE HOW TO CALL THESE VARIABLES    
cmd.Parameters.Append _ 
    cmd.CreateParameter("@SPstateNGN", adVarChar, adParamInput, 0, "& stateNGN &") 
cmd.Parameters.Append _ 
    cmd.CreateParameter("@SPstateDate", adDate, adParamInput, 0, "& stateDate &") 

问题是与你传递作为参数的2个值:"& stateNGN &""& stateDate &"。在这种情况下,您不必对变量进行任何操作,因为它们已经包含要传递给存储过程的值,并且CreateParameter调用将为您处理它们。

所以只要改变这些呼吁:

cmd.Parameters.Append _ 
    cmd.CreateParameter("@SPstateNGN", adVarChar, adParamInput, 0, stateNGN) 
cmd.Parameters.Append _ 
    cmd.CreateParameter("@SPstateDate", adDate, adParamInput, 0, stateDate) 

请注意,您也可以在一个步骤创建参数,然后在后续步骤中的值分配给它,而不是所有功能于一身以上采取的方法。有关CreateParameter的更多示例可以在各种堆栈溢出线程和MSDN网站上找到。

相关问题