背景:我正在使用Microsoft SQL Server 2008后端的Access 2010用户前端工作.访问中的表都链接到SQL Server数据库.我有一个存储过程,将新值(由参数提供)插入表中.我经历了很多例子,但我不明白是否真的很接近它或者我完全没有.我之前问了一个类似的问题并得到了一个好的anwser,但我有关于连接字符串的问题.这是在VBA中从Access模块传递参数时调用存储过程的问题/ anwser
我不知道,也不知道如何找到建立连接字符串所需的信息(例如:我不知道提供者/服务器名称/服务器地址).我在这里发现了一个问题:"如果你已经有一个指向SQL Server数据库的Access链接表,那么你可以简单地使用它的.Connect字符串和DAO.QueryDef对象来执行存储过程" - Access的连接字符串调用SQL Server存储过程我试图实现这个代码,但我不确定如何传递参数,所以我尝试使用前面的例子.但是我在"Set rst = qdf.OpenRecordset(dbOpenSnapshot)"这一行得到了错误"call failed",更不用说我的传递参数代码可能是关闭的.
Set qdf = CurrentDb.CreateQueryDef("")
qdf.Connect = CurrentDb.TableDefs("tblInstrumentInterfaceLog").Connect
qdf.sql = "EXEC dbo.upInsertToInstrumentInterfaceLog"
qdf.ReturnsRecords = True
Set rst = qdf.OpenRecordset(dbOpenSnapshot)
qdf.Parameters.Append qdf.CreateParameter("@BatchID", adVarChar, adParamInput, 60, BatchID)
qdf.Parameters.Append qdf.CreateParameter("@InstrumentName", adVarChar, adParamInput, 60, InstrumentName)
qdf.Parameters.Append qdf.CreateParameter("@FileName", adVarChar, adParamInput, 60, FileName)
qdf.Parameters.Append qdf.CreateParameter("@QueueId", adVarChar, adParamInput, 60, QuenueId)
rst.Close
Set rst = Nothing
Set qdf = Nothing
Run Code Online (Sandbox Code Playgroud)
谁能告诉我我的代码有什么问题以及为什么我会收到此错误?谢谢!
我正在使用 Access 2010 和 Microsoft SQL Server 2008 后端工作。我有一个存储过程,它将新值(由参数提供)插入到表中。分配给参数的值是从存储在文件夹中的文件中获取的。Windows 文件系统用于扫描特定文件夹以生成其中文件的列表。对于每个扫描的文件,都会调用存储过程,并将 FileName 和 QueueId(不带扩展名的文件名)以及其他值用作所调用的存储过程的参数。存储过程用于为表的每个文件创建新记录。
\n\nPublic Function CreateInstrumentInterfaceLogRecords(BatchID As Long, InstrumentName As String) As Boolean\nOn Error GoTo HandleError\n\nDim objFSO As FileSystemObject\nDim AllFiles As Object\nDim objFolder As Object\nDim objFile As Object\nDim FileExt As String\nDim strSQL As String\n\nCreateInstrumentInterfaceLogRecords = False\nstrSQL = "SELECT FileExt FROM tlkpInstrument"\nFileExt = ExecuteScalar(strSQL)\n\n\nSet objFSO = CreateObject("Scripting.FileSystemObject")\nSet objFolder = objFSO.GetFolder(NewPath) \n\n\'NewPath is a public variable that holds the path to the folder\'\n\nSet AllFiles = objFolder.Files\nFor Each objFile In AllFiles\n\nFileName = …Run Code Online (Sandbox Code Playgroud) 所以这是交易,我有一个存储过程,接受三个输入参数,并有一个输出参数.最初它看起来像这样:
CREATE PROCEDURE upGetTestIDForAnalyte @ThisWOID nvarchar(60), @SampleID nvarchar(60),@Analyte nvarchar(60), @TestId int OUT
AS
SELECT @TestID = t1.TestID
FROM tblWOSampleTest t1 JOIN tblTest t2
ON t1.TestID=t2.TestID
WHERE (t1.SampleID = @SampleID) AND (t2.Analyte = @Analyte) AND (t1.WOID = @ThisWoid)
SELECT @TestID =ISNULL(@Testid,0)
Go
Run Code Online (Sandbox Code Playgroud)
它在MS-SQL Server Management Studio 2008上执行时效果很好,但在MS-Access 2010(VBA)中调用时,我会收到以下错误:将nvarchar值'1406-00591'转换为数据类型int时转换失败.(我的@ThisWoid输入)
所以基本上我发布了一个关于这个的问题,我发布了所有内容(我称之为存储过程/表columns..ect的数据类型),我被告知一切看起来很好,它可能与我的值有关分配给我的输入参数,如果有人好奇,我会将链接发布到页面底部的上一个问题.我找到了一种循环漏洞,通过使用'LIKE'代替'='来摆脱这个错误,因为数据类型约束对于'LIKE'并不那么严格(我不知道最好的解决方案,但我很想要取得进展).无论如何,现在我的SQL代码如下所示:
CREATE PROCEDURE upGetTestIDForAnalyte2 @ThisWOID nvarchar(60), @SampleID nvarchar(60),@Analyte nvarchar(60), @TestId int OUT
AS
SELECT @TestID = t1.TestID
FROM tblWOSampleTest t1 JOIN tblTest t2
ON t1.TestID=t2.TestID
WHERE (t1.SampleID LIKE @SampleID) AND (t2.Analyte Like @Analyte) …Run Code Online (Sandbox Code Playgroud)