是否可以在 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
虽然多年来我一直在使用 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