收到错误"您输入的对象不是有效的记录集属性"访问2013将记录集分配给表单

时间:2016-05-03 20:00:39

标签: sql-server vba stored-procedures

我正在使用Access 2013来升级带有sql 2012后端的旧应用程序。我有几个带参数的存储过程,我需要调用它们并将其分配给表单和报告。

我遇到的问题是我得到了错误" 7965"每次我尝试将返回的记录集分配给表单 我正在使用表单的开放事件和以下代码 Private Sub Form_Open(取消为整数)

    Dim cmd1 As ADODB.Command
    Dim recs1 As New ADODB.Recordset
    Dim prm1 As ADODB.Parameter
    Dim prm2 As ADODB.Parameter
    Dim prm3 As ADODB.Parameter
    Set cnn = CreateObject("ADODB.Connection")

    cnn.ConnectionString = "DRIVER={SQL Server Native Client     11.0};SERVER=192.168.0.12;DATABASE=SavingsPlusCorp;Trusted_Connection=yes;"


    cnn.Open cnn.ConnectionString
    Set cmd1 = New ADODB.Command


    Set cmd1.ActiveConnection = cnn


cmd1.CommandText = "dbo.iNVENSOLDSp"
cmd1.CommandType = adCmdStoredProc

Set prm1 = cmd1.CreateParameter("@branchid", adInteger, adParamInput, 2)
cmd1.Parameters.Append prm1

Set prm2 = cmd1.CreateParameter(" @Beginning_Date", adDate, adParamInput)
cmd1.Parameters.Append prm2

Set prm3 = cmd1.CreateParameter(" @Ending_Date", adDate, adParamInput)
cmd1.Parameters.Append prm3

Set prm4 = cmd1.CreateParameter("@vENDORID", adInteger, adParamInput, 2)
cmd1.Parameters.Append prm4

Set prm5 = cmd1.CreateParameter("@catID", adInteger, adParamInput, 2)
cmd1.Parameters.Append prm5



prm1.Value = Form_ReportGenerator.Branches
prm2.Value = Form_ReportGenerator.Begin_Date
prm3.Value = Form_ReportGenerator.Ending_Date
prm4.Value = Form_ReportGenerator.Vendors
prm5.Value = Form_ReportGenerator.Category


Set recs1 = CreateObject("ADOdB.recordset")
 recs1.CursorType = adOpenKeyset
 recs1.CursorLocation = adUseClient
'Set recs1 = cmd1.Execute
'recs1.Open
Set Me.Recordset = cmd1.Execute 

我也试过

set me.Recordset= recs1

具有相同的结果 请帮忙 被识别为可能的线程中的解决方案几乎与我的尝试相同 事实上,我用它来构建我的尝试 我用了这个命令。执行并将其分配给我的表单

Set me.RecordSet = cmd1.execute

这一行返回错误 它是我用于连接的提供商的问题 我不明白为什么它不起作用 请帮忙

2 个答案:

答案 0 :(得分:0)

我遇到了这个问题,花了好几个小时寻找它……转而就在我的鼻子下面: 当我出于几乎不相关的原因将adUseClient更改为adUseServer之后,从Mysql支持的Access组合框重新填充了一个功能很好的功能后,突然出现此消息。这是代码(感谢作者:Christian Coppes)

Public Function fnADOComboboxSetRS(cmb As String, strSQL As String, strCallingForm As String, Optional StrCnnstring As String)
    On Error GoTo fnADOComboboxSetRS_Error

    Dim sourceDB As New clsAdoDBHelper
    Dim RS1 As New ADODB.Recordset

    If Len(StrCnnstring & vbNullString) = 0 Then
       sourceDB.Connect CnString
    Else
       sourceDB.Connect StrCnnstring

    End If

    Set RS1 = sourceDB.OpenRecordset(strSQL, adUseClient)

    Set Application.Forms(strCallingForm).Controls(cmb).Recordset = RS1
fnADOComboboxSetRS_Exit:
    If Not RS1 Is Nothing Then
        If RS1.State = adStateOpen Then RS1.Close
        Set RS1 = Nothing
    End If
    Exit Function

fnADOComboboxSetRS_Error:
    Select Case Err
        Case Else
            'fnErr "modODBC->fnADOComboboxSetRS", True
            Resume fnADOComboboxSetRS_Exit
    End Select
End Function

答案 1 :(得分:-1)

您需要调用ADO.Recordset对象的Open方法。

为了演示这一点,首先在SQL Server中创建一个简单的存储过程。

USE AdventureWorks2016CTP3;
GO

CREATE PROCEDURE dbo.up_TestPerson
AS
    SELECT BusinessEntityID, FirstName, LastName
        FROM Person.Person;

然后使用此代码创建Microsoft Access表单。

Private Sub Form_Open(Cancel As Integer)

    Dim cnn As New ADODB.Connection
cnn.ConnectionString = "DRIVER={SQL Server Native Client 11.0};SERVER=V-SQL16-R;DATABASE=AdventureWorks2016CTP3;Trusted_Connection=yes;"
    cnn.Open

    Dim cmd1 As New ADODB.Command
    Set cmd1.ActiveConnection = cnn
    cmd1.CommandText = "dbo.up_TestPerson"
    cmd1.CommandType = adCmdStoredProc

    Dim rst As New ADODB.Recordset
    rst.Open cmd1, , adOpenKeyset, adLockPessimistic

    Set Me.Recordset = rst

End Sub

打开表单,然后显示数据。

enter image description here

要演示使用参数,请创建这样的存储过程。 (与第一个存储过程相同,但它具有参数和WHERE子句。)

CREATE PROCEDURE dbo.up_TestPerson2
(
    @PersonType nchar(2)
)
AS
SELECT BusinessEntityID, FirstName, LastName
    FROM Person.Person
    WHERE PersonType = @PersonType;

使用此代码创建另一个Access窗体。 (与第一个表单相同,但我们创建和配置参数的块除外。)

Private Sub Form_Open(Cancel As Integer)

    Dim cnn As New ADODB.Connection
    cnn.ConnectionString = "DRIVER={SQL Server Native Client 11.0};SERVER=V-SQL16-R;DATABASE=AdventureWorks2016CTP3;Trusted_Connection=yes;"
    cnn.Open

    Dim cmd1 As New ADODB.Command
    Set cmd1.ActiveConnection = cnn
    cmd1.CommandText = "dbo.up_TestPerson2"
    cmd1.CommandType = adCmdStoredProc

    ' This is new
    Dim prm1 As ADODB.Parameter
    Set prm1 = cmd1.CreateParameter("@PersonType", adWChar, adParamInput, 2)
    cmd1.Parameters.Append prm1
    prm1.Value = "EM"

    Dim rst As New ADODB.Recordset
    rst.Open cmd1, , adOpenKeyset, adLockPessimistic

    Set Me.Recordset = rst

End Sub

打开表单,显示与参数匹配的记录。

enter image description here