虽然多年来我一直在为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
这段代码将被重用(我现在只是进行开发测试),我希望它更直观,不仅对我而言,还有其他可能最终维持这个的人。
那么,问题是,有没有办法填充结果集,以便命名字段,从而允许项目引用是名称而不是索引号?
答案 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