是否可以在输出参数化存储过程的ADODB结果集中返回带有名称的字段

时间:2017-01-17 16:27:18

标签: sql-server vba stored-procedures resultset adodb

虽然多年来我一直在为VBA工作很多,但我发现我第一次有机会使用它连接到MS SQL数据库并执行许多不同的查询。此问题是关于返回的结果集具有命名字段。目前,经过一些参数的争论,我的查询工作正常。它执行一个参数化存储过程,该过程具有一个输入和两个输出参数。

这是sp:

ALTER PROCEDURE [dbo].[uspGetFamily] 
-- Add the parameters for the stored procedure here
@FormulaNum     varchar(10),
@FamilyID       bigint OUTPUT,
@FamilyName     varchar(20) OUTPUT
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

-- Insert statements for procedure here
SELECT @FamilyID = v.FamilyID, @FamilyName = f.FamilyName FROM utblVariants as v
    INNER JOIN dbo.utblFamilies as f
    ON v.FamilyID = f.FamilyID
WHERE v.FormulaNo = @FormulaNum

SELECT @FamilyID, @FamilyName
END

以下是VBA代码的相关部分:

'open the connection to the database
oConn.Open sConnString

'setup the command parameter including the sp parameters
With oCmd
    .ActiveConnection = oConn
    .CommandText = "BWDG.dbo.uspGetFamily"
    .CommandType = adCmdStoredProc
    'Formul number input parameter
    .Parameters.Append .CreateParameter("@FormulaNum", adVarChar, adParamInput, 10, Trim(txtFromFormula.Value))
    'Formula Family ID returned as an output parameter
    .Parameters.Append .CreateParameter("@FamilyID", adBigInt, adParamOutput, , Null)
    'Formula Family name returned as an output parameter
    .Parameters.Append .CreateParameter("@FamilyName", adVarChar, adParamOutput, 20, Null)

End With

'Get the resultset from the executed connection command
oRS.Open oCmd
'Set oRS = oConn.Execute(sExecString)

If Not (oRS.EOF And oRS.BOF) Then
    oRS.MoveFirst
    'Parse the data to corresponding variables
    iFromFamilyID = oRS(0)
    sFromFamily = oRS(1)

    lblFromFamily.Caption = sFromFamily

End If

我希望结果集oRS中的项目返回名为的字段。目前,这些字段的名称是空的。 Field Names in the result set

这段代码将被重用(我现在只是进行开发测试),我希望它更直观,不仅对我而言,还有其他可能最终维持这个的人。

那么,问题是,有没有办法填充结果集,以便命名字段,从而允许项目引用是名称而不是索引号?

1 个答案:

答案 0 :(得分:2)

您有out个参数...为什么需要select这些参数并将它们记录在记录集中?

'...

Dim familyId As ADODB.Parameter
Dim familyName As ADODB.Parameter

With cmd
    '...
    Set familyId = .CreateParameter("@FamilyID", adBigInt, adParamOutput, , Null)
    .Paramters.Append familyId
    Set familyName = .CreateParameter("@FamilyName", adVarChar, adParamOutput, 20, Null)
    .Parameters.Append familyName

    .Execute
End With

然后您可以在那里检索out参数值:

lblFromFamily.Caption = familyName.Value

没有记录集需要参与。

或者,如果您希望选择结果并返回Recordset,您可以这样做 - 但是,删除{{ 1}}参数

在这种情况下,您需要为列添加别名as was already mentioned in comments

out

(可以包含SELECT @FamilyID FamilyID, @FamilyName FamilyName 关键字,如果您愿意,也可以选择<)>

然后您可以按名称检索字段:

As

或者,使用等效的简写“bang”表示法(假设列别名是合法的VBA标识符):

familyId = rs.Fields("FamilyID").Value
familyName = rs.Fields("FamilyName").Value