所以这里的交易,我有一个存储过程,接受三个输入参数,并有一个输出参数。最初它看起来像这样:
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
在MS-SQL Server Management Studio 2008上执行时效果很好,但在MS-Access 2010(VBA)中调用时,我会收到以下错误:转换nvarchar值时转换失败' 1406-00591&# 39;到数据类型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) AND (t1.WOID Like @ThisWoid)
SELECT @TestID =ISNULL(@Testid,0)
go
同样它在SQL Management Studio中运行得很好但是当我在MS-Access中调用它时它总是返回0.因此,我进行了一点测试我再次更改了SQL代码,看它是否可以通过强制值返回非零值我知道肯定会返回一个值,这是代码:
CREATE PROCEDURE upGetTestIDForAnalyte3 @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.woid LIKE '1406-00591') AND (t2.Analyte LIKE 'lead') AND (t1.SampleID LIKE 1)
SELECT @TestID =ISNULL(@Testid,0)
Go
最后是的,正确的输出已保存到@TestID。太好了,我取得了一些进展。 (有点)。所以,我好奇并改变了“喜欢”。回到' ='它返回正确的值!在这一点上,我真的不知道发生了什么,但我只是随便滚动。然后我将我的SQL代码更改回upGetTestIDForAnalyte2(我将它们标记为不同的btw),当我调用我的存储过程时,我采用相同的值并将它们分配给输入参数,如:
Set cmd = New ADODB.Command
cmd.ActiveConnection = Conn
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "upGetTestIDForAnalyte2"
cmd.Parameters.Append cmd.CreateParameter("@Analyte", adVarChar, adParamInput, 60, "lead")
cmd.Parameters.Append cmd.CreateParameter("@ThisWOID", adVarChar, adParamInput, 60, "1406-00591")
cmd.Parameters.Append cmd.CreateParameter("@SampleID", adDouble, adParamInput, 60, 1)
cmd.Parameters.Append cmd.CreateParameter("@testid", adDouble, adParamOutput, , adParamReturnValue)
cmd.Execute
Conn.Close
ThisTestID = cmd.Parameters("@testid").Value
它返回始终将TestId设置为0.我还将我的ThisTestID初始化为5以确保其更改,并且它将更改为0.只是为了确保我使用相同的输入值运行upGetTestIDForAnalyte并且我得到了相同的错误我上面了。所以这就是我现在所处的位置。以下是我从SQL代码中使用的表的一些信息:
SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, IS_NULLABLE
FROM INFORMATION_SCHEMA.COLUMNS IC
where (TABLE_NAME = 'tblwosampletest' and COLUMN_NAME = 'woid')
OR (TABLE_NAME = 'tblwosampletest' and COLUMN_NAME = 'sampleID')
OR (TABLE_NAME = 'tbltest' AND COLUMN_NAME = 'Analyte)'
结果: 我还将我的变量定义为:
Dim Analyte As String
Dim ThisWOID As String
Dim ThisSampleID As Long
Dim ThisTestID As Long
链接到上一个问题(不会说它有点令人困惑)Unknown invalid type converson in my SQL stored Procedure 好的,如果有人需要更多信息或澄清,请询问,谢谢你的帮助!此外,如果你不知道答案,你可以建议我做的测试。
答案 0 :(得分:5)
您的变量订单与PROC无关。
您的VB订单是:
cmd.Parameters.Append cmd.CreateParameter("@Analyte", adVarChar, adParamInput, 60, "lead")
cmd.Parameters.Append cmd.CreateParameter("@ThisWOID", adVarChar, adParamInput, 60, "1406-00591")
cmd.Parameters.Append cmd.CreateParameter("@SampleID", adDouble, adParamInput, 60, 1)
cmd.Parameters.Append cmd.CreateParameter("@testid", adDouble, adParamOutput, , adParamReturnValue)
你的处理顺序是:
@ThisWOID nvarchar(60),
@SampleID nvarchar(60),
@Analyte nvarchar(60),
@TestID int out
除非你在vb中指定cmd.NamedParameters=True
,否则使用序数顺序,因此你的vb @Analyte
被放入SQL @ThisWOID
,而vb @ThisWOID
是放入SQL @SampleID
- 这可能是您的NVARCHAR-INT
转换问题。
按顺序获取您的名字,或将命名的params属性设置为true,并修复您的SQL proc,以使@SampleID
与您的表格匹配INT
。
之后你应该是金色的。