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

Can the fields be returned with names in a ADODB Result set for an output parameterized stored procedure

虽然多年来我一直在使用 VBA,但我第一次有机会使用它连接到 MS SQL 数据库并执行许多不同的查询.这个问题是关于让结果集 returned 有命名字段。目前,在与参数进行了一些斗争之后,我的查询工作正常了。它执行具有一个输入和两个输出参数的参数化存储过程。

这是 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 为 return 并命名字段。目前字段的名称是空的。 Field Names in the result set

此代码将得到重用(我目前只是在执行开发测试),我希望它更直观,不仅对我而言,对可能最终维护此代码的其他人来说也是如此。

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

您有 out 个参数...为什么您需要 select 它们和 return 它们在记录集中?

'...

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

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

lblFromFamily.Caption = familyName.Value

不需要涉及记录集。


或者,如果您想要到select结果和return一个Recordset ,您可以这样做 - 但是 删除 out 参数 !

在这种情况下,您需要为您的列添加别名,

SELECT @FamilyID FamilyID, @FamilyName FamilyName

(如果您愿意,可以选择包含 As 关键字)

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

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

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

familyId = rs!FamilyID
familyName = rs!FamilyName