2013-04-26 90 views
7

我使用Access數據庫,並且必須使用到SQL Server的數據源連接。如何使用ADODB.Recordset填充ListBox(錯誤91)在Access中執行自動填充

要做到這一點我使用ADODB對象有:

-ADODB.Connection

-ADODB.Recordset

代碼跟上時代的,下面伊恩的觀察Kenney

Dim cnn As ADODB.Connection 
    Set cnn = New ADODB.Connection 
    Dim rs As ADODB.Recordset 

    cnn.ConnectionString = "driver={SQL Server};provider=SQLOLEDB;server=10.****;uid=****readonly;pwd=****readonly;database=****" 
    cnn.Open 

    Set rs = cnn.Execute("SELECT [MATRI], [NOMPRE] FROM SCHEME_DB.TABLE WHERE NOMPRE LIKE '*" & Me.Textbox_recherche.Text & "*'") 



    Me.Liste_choix.RowSourceType = "Table/List" 
    Me.Liste_choix.Recordset = rs 

    rs.Close 
    cnn.Close 

(此代碼(代碼的一部分)是一種在Access中使用文本框和列表框執行自動完成的方法)

而且我運行此代碼時出現錯誤91:「錯誤91:對象變量或塊變量未設置「。

我不明白如何解決此問題。

在此先感謝。

回答

5

您告訴我們,代碼會拋出錯誤91,「對象變量或塊變量未設置」。不幸的是,你沒有指出哪一行會觸發錯誤。這迫使我們猜測問題出在哪裏。

的一個問題是在這裏:

Me.Liste_choix.Recordset = rs 

試圖到另一個對象的分配。 =符號足以用於簡單數據類型的分配...即MyVariable = 2。但是,您必須在對象分配中包含Set關鍵字。

Set Me.Liste_choix.Recordset = rs 

雖然你應該做出這樣的改變,但我並不確定這是導致錯誤91的原因;我會猜測訪問會抱怨「無效的財產使用」而不是。

SELECT聲明是另一個問題,但我不確定它是否有助於您報告的錯誤。 WHERE子句使用Like與具有*作爲通配符的模式進行比較。該查詢可能會返回您在從DAO運行時所期望的內容。但是,您使用的ADO將*僅作爲星號字符使用,沒有任何特殊含義。因此,從ADO運行它時,查詢可能不會返回任何行。將*替換爲%

作爲一般建議,如果您的代碼模塊尚未在其聲明部分中包含Option Explicit,請添加它。然後從VB編輯器的主菜單中運行Debug-> Compile。修復編譯器抱怨的任何事情。確保您在進一步排除故障之前完成了這些工作。

+0

謝謝,我給你的賞金,但我認爲一個重要的問題是如何聲明ADODB.Connection對象的方式。我們必須聲明這個對象.Properties(不知道具體爲什麼......)就像我的回答中一樣...... – 2013-04-30 12:14:03

4

使用前

RS這裏關閉

rs.Close 

您已經關閉了記錄和連接,並連接在這裏關閉這裏使用

cnn.Close 

Me.Liste_choix.RowSourceType = "Table/List" 

RS

Me.Liste_choix.Recordset = rs 

更新docs

使用Close方法關閉連接對象還關閉與該連接相關聯的任何 活性記錄的對象。與正在關閉的Connection對象關聯的對象 將保留 ,但它不再與Connection對象關聯; 也就是說,它的ActiveConnection屬性將被設置爲Nothing。同樣, Command對象的Parameters集合將被清除任何 提供程序定義的參數。

使用Close方法關閉記錄集,記錄或流對象 將釋放相關數據以及您可能通過此特定對象獲得的對數據的任何專有訪問權限 。您稍後可以調用 打開方法重新打開具有相同或修改的屬性的對象。當Recordset對象關閉時,調用任何需要實時遊標的方法 都會產生錯誤。

SQL INJECTION 也有直接從用戶輸入構建SQL的sql injection風險。
此問題(MS Access prepared statements)顯示瞭如何使用參數化查詢 - 值得一看。

+0

這不是錯誤的原因,當我移動rs.Close和cnn.Close下Me.Liste_choix.Recordset = RS,我已經得到了錯誤。 – 2013-04-26 08:19:30

+0

您是否嘗試將rs.close/cnn.close移到使用記錄集後? – 2013-04-26 08:30:02

+0

是... Me.Liste_choix.RowSourceType = 「表/列表」 Me.Liste_choix.Recordset = RS rs.Close cnn.Close – 2013-04-26 08:34:41

7

我解決我的問題(錯誤91),有三個問題:在ADODB.Connection,在選擇*(感謝HansUp),並設置爲listbox.recordset創建(感謝HansUp再次)

我解決了這個錯誤:

 Private Sub Textbox_recherche_Change() 

       Dim cnn As ADODB.Connection 
       Set cnn = New ADODB.Connection 
       Dim rs As ADODB.Recordset 

'A important point to solve the Error 91 is to declare your ADODB.Connection with .Properties like that : (I don't use Windows NT authentification but the SQL Server authentification) 


       With cnn 
        .Provider = "Microsoft.Access.OLEDB.10.0" 
        .Properties("Data Provider").Value = "SQLOLEDB" 
        .Properties("Data Source").Value = "10.******" 
        .Properties("User ID").Value = "*****readonly" 
        .Properties("Password").Value = "*****readonly" 
        .Open 
       End With 

    'The second point is to replace the * in the search for the autocompletion by the % 

       Set rs = cnn.Execute("SELECT [NOMPRE] FROM ****.***** WHERE NOMPRE LIKE '%" & Me.Textbox_recherche.Text & "%'") 

    'You have to declare the RowSourceType of your listbox to "Table/Query" 

      Me.Liste_choix.RowSourceType = "Table/Query" 

    'And Finally to SET your recordset like that: 

      Set Me.Liste_choix.Recordset = rs 

       rs.Close 
       cnn.Close 

       Set cnn = Nothing 
       Set rs = Nothing    

      End Sub