簡體   English   中英

使用存儲的過程作為MS Access窗體Recordsource

[英]Using a Stored Procedure as a MS Access form Recordsource

現在,我有一個數據庫,帶有一個SQL Server后端和一個MS Access前端。 在一種形式上,我的用戶正在經歷緩慢的加載時間才能顯示它。 該表單實際上是查找用戶身份的(基於他們的登錄ID,這部分有效),查看其訪問權限(只讀,v。更新等;這也有效),然后拉出允許的項目根據他們的訪問權限進行查看(我認為這是運行緩慢的部分)。

為了使此表單加載更快,我覺得將最后一部分(將允許他們看到的項目拉到該部分的部分)移到SSMS存儲過程中應該使表單加載更快。

我已經用SSMS編寫了存儲過程,並且在“表單加載”事件上有調用存儲過程的代碼。 我面臨的問題是使存儲過程的結果成為表單的Recordsource。 我已經嘗試過Me.RecordSource,但這似乎不起作用。 下面是調用存儲過程的代碼的副本:

這與使用代碼調用SP有所不同,因為我已經有了調用它的代碼,但是,我需要將SP的結果作為MS Access表單的記錄源。

任何幫助或想法將不勝感激! (例如,我想到嘗試使用臨時表作為記錄源...)

Dim rs1 As ADODB.Recordset

Dim cmd As ADODB.Command
Dim prm As ADODB.Parameter

cn.ConnectionString = "DRIVER=SQL Server;SERVER=SERVERNAME;APP=Microsoft     Office XP;WSID=MYCOMPUTER;DATABASE=dbname;Trusted_Connection=Yes;"

cn.Open


Set cmd = New ADODB.Command
Set rs1 = New ADODB.Recordset
With cmd
    .ActiveConnection = cn
    .CommandType = adCmdStoredProc
    .CommandText = "dbo.ProcProjectSelection"
    Set prm = .CreateParameter("@xID", adVarChar, adParamInput, 10, Me.txtNetworkID)
    .Parameters.Append prm
        End With

如果輸入:Set Me.RecordSource = rs1在“結束於”之前,我收到一條錯誤消息,提示“無效使用屬性”

解決方案1:

將存儲過程返回的Recordset分配給Form.Recordset對象

在代碼末尾添加此行

Set Me.Recordset = cmd.Execute

解決方案2:

您可以基於ODBC數據源創建傳遞查詢,並將其用作記錄源

然后,在表單的屬性表中,設置屬性:

record source = your_pass_through_query
recordset type = dynamic

編輯:

我的建議使用解決方案2來避免ADO和運行時錯誤的許多設置

示例:使用northwind和存儲過程進行傳遞

將表單中的控件與查詢結果集的字段名稱綁定

Private Sub Form_Open(Cancel As Integer)
 test
 End Sub

 Sub test()
 Dim qdf As DAO.QueryDef, rst As DAO.Recordset
 Set qdf = CurrentDb.CreateQueryDef("")
 qdf.Connect = "ODBC;Driver=SQL Server;Server=xxxx;database=northwind;Trusted_Connection=Yes;"

' stored procedure with paramete
 qdf.SQL = "exec [CustOrderHist] 'ALFKI'"

 qdf.ReturnsRecords = True
 Set rst = qdf.OpenRecordset

 Set Me.Recordset = rst

 End Sub

解決方案:使用傳遞查詢將數據從存儲過程獲取到子窗體中

將以下代碼添加到您的SubForm RecordSource字段中
Select * from YourPassThruQueryName

在您的Form_Load()中
Dim qdf as DAO.QueryDef
Set qdf = CurrentDb.QueryDefs("YourPassThruQueryName") ' If it exist
Set qdf = CurrentDb.CreateQueryDef("YourPassThruQueryName") ' If you have to create one

您必須具有默認的Select語句,所以請使用以下命令:
qdf.sql = "Select * from anyTable where 0=1"
Set qdf = Nothing

重要!
您必須使用以下代碼刷新您的子窗體,因為重新查詢將不起作用:
Me.frm_Your_Sub_Form_Name.SourceObject = "frm_Your_Actual_Sub_Form_Name"

最后!
在“提交”按鈕中進行存儲過程所需的選擇時,請使用以下內容更新子表單:

Private Sub btn_Submit_Click()
Dim rs_tmp as DAO.Recordset
Dim qdf as DAO.QueryDef
Dim sp as String
sp = "EXEC DBO.USP_Your_SQL_Server_Stored_Procedure_Name '" & prevdate & "','" & currdate & "'"
Set qdf = CurrentDb.QueryDefs("YourPassThruQueryName")
qdf.Connect = adoConnectionString ' This is your Connection string for SQL Server
qdf.sql = sp
qdf.ReturnsRecords = True
Set rs_tmp = qdf.OpenRecordset
If Not rs_tmp.EOF Then
Me.frm_Your_Sub_Form_Name.SourceObject = "frm_Your_Actual_Sub_Form_Name"
rs_tmp.Close
End If
Set rs_tmp = Nothing
Set qdf = Nothing
End Sub

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM