[英]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.