【问题标题】:Calling Stored Procedure while passing parameters from Access Module in VBA从 VBA 中的访问模块传递参数时调用存储过程
【发布时间】:2014-08-06 14:00:45
【问题描述】:

我正在使用带有 Microsoft SQL Server 2008 后端的 Access 2010。我有一个将新值(由参数提供)插入到表中的存储过程。分配给参数的值是从存储在文件夹中的文件中获得的。 Windows 文件系统用于扫描特定文件夹以列出其中的文件。对于每个扫描的文件,都会调用存储过程,并使用 FileName 和 QueueId(不带扩展名的文件名)以及其他值作为调用的存储过程的参数。存储过程用于为表的每个文件创建新记录。

Public Function CreateInstrumentInterfaceLogRecords(BatchID As Long, InstrumentName As            String) As Boolean
On Error GoTo HandleError

Dim objFSO As FileSystemObject
Dim AllFiles As Object
Dim objFolder As Object
Dim objFile As Object
Dim FileExt As String
Dim strSQL As String

CreateInstrumentInterfaceLogRecords = False
strSQL = "SELECT FileExt FROM tlkpInstrument"
FileExt = ExecuteScalar(strSQL)


Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder(NewPath) 

'NewPath is a public variable that holds the path to the folder'

Set AllFiles = objFolder.Files
For Each objFile In AllFiles

FileName = objFile.FileName
QuenueId = Replace(FileName, FileExt, "")

'call procedure to pass values'

Next objFile

ExitProc:
Exit Function
HandleError:
MsgBox Err.Number & " " & Err.Description & " in CreateInstrumentInterfaceLogRecords"
GoTo ExitProc

End Function

存储过程是:

CREATE PROCEDURE upInsertToInstrumentInterfaceLog @BatchID nvarchar(60),@InstrumentName nvarchar(60) ,@FIleName nvarchar(60), @QueueId nvarchar(60) 
AS
INSERT INTO tblInstrumentInterfaceLog (BatchID,InstrumentName,FileName,QueueID,DateOfBatch,Folder)
VALUES (@BatchID, @InstrumentName,@FileName, @QueueId,getdate(),'New');
GO

所有示例并没有真正让我对创建连接和调用过程有一个可靠的想法。我得到的一些建议是研究 ExecuteNonquery 的工作原理,所以我一直在尝试找到与此相关的示例。以下是我找到的示例模板之一

Dim conn As ADODB.Connection 
Dim cmd As ADODB.Command 

Set conn = New ADODB.Connection 
conn.ConnectionString = “your connection String here” 
conn.Open 

Set cmd = New ADODB.Command 
cmd.ActiveConnection = conn 
cmd.CommandType = adCmdStoredProc 
cmd.CommandText = "put stored procedure name here" 

cmd.Execute 
conn.Close 

Set conn = Nothing 
Set cmd = Nothing 

我不确定我应该从这个例子中得到什么以及如何合并传递值。此外,即使我访问过http://www.connectionstrings.com/,我仍然对如何制作它们感到困惑。任何帮助将不胜感激

【问题讨论】:

  • 您的具体问题是什么?您是在问如何将值从 VBA 过程传递到存储过程并调用它?
  • 是的,很抱歉没有澄清。我的问题是如何将值传递给并调用存储过程。
  • MSDN 有一个example

标签: sql sql-server vba ms-access stored-procedures


【解决方案1】:
Dim conn As ADODB.Connection 
Dim cmd As ADODB.Command 

Set conn = New ADODB.Connection 
conn.ConnectionString = “your connection String here” 
conn.Open 

Set cmd = New ADODB.Command 
cmd.ActiveConnection = conn 
cmd.CommandType = adCmdStoredProc 
cmd.CommandText = "upInsertToInstrumentInterfaceLog" 

cmd.parameters.Append cmd.CreateParameter("@BatchID", adVarChar, adParamInput, 60, "value for BatchID")   
cmd.parameters.Append cmd.CreateParameter("@InstrumentName", adVarChar, adParamInput, 60, "value for InstrumentName")   
'...

cmd.Execute 
conn.Close 

【讨论】:

    【解决方案2】:

    使用保存的传递查询。

    然后你的代码变成:

    With currentdb.querydefs("MyPass")
      .sql = "exec StoreProcName " & strBach & “,” & strInstrmentName
      .execute
    End With
    

    所以,这里只需要两行代码。如果您使用保存的传递查询,您甚至不必声明任何连接字符串甚至任何变量。

    【讨论】:

    • 如果 strInstrumentName 或 strFileName 包含 ' 或 -- 甚至空格之类的字符怎么办?
    • 对于您在 SQL Server 中键入的任何存储过程以及 t-sql 的工作方式,规则都是相同的。上面假设了一个数字参数。如果是文本,那么函数应该返回它的值,用单引号括起来,或者可以用 "'" & MyFunction() & "'" 将它们添加到上面
    猜你喜欢
    • 2022-01-10
    • 2014-11-19
    • 2013-01-23
    • 1970-01-01
    • 2015-08-24
    • 2021-12-29
    • 1970-01-01
    • 2014-06-23
    • 1970-01-01
    相关资源
    最近更新 更多