2011-01-24 13 views
6

Kayıtlı bir yordamın sonuçlarını bir forma döndürmeye çalışıyorum. Eğer bir nesne atamak her Set kullanmak gerekirAccess formunu Kayıtlı Yordam'ın sonucuna bağlama

Private Sub RetrieveSiteInformation() 

    Dim cmd As New ADODB.Command 
    Dim cnn As New ADODB.Connection 
    Dim rs As ADODB.Recordset, f As ADODB.Field 

    With cnn 
    .Provider = "SQLOLEDB" 
    .ConnectionString = 
     "data source=UKFCSVR;initial catalog=ACACB;Trusted_Connection=Yes" 
    .Open 
    End With 

    Dim param1 As ADODB.Parameter 
    If Nz(txtSiteID_Search.Value, vbNullString) <> vbNullString Then 
    Set param1 = cmd.CreateParameter("@SiteID", adBigInt, adParamInput) 
    param1.Value = txtSiteID_Search.Value 
    cmd.Parameters.Append param1 
    End If 

    With cmd 
    .ActiveConnection = cnn 
    .CommandText = "spSiteInformation_Retrieve" 
    .CommandType = adCmdStoredProc 
    **' THIS FAILS** 
    Me.Recordset = .Execute 
    **' THIS LOOP WORKS FINE** 
    ' Set rs = .Execute 
    ' rs.MoveFirst 
    ' For Each f In rs.Fields 
    '  Debug.Print f.Name 
    ' Next 
    ' With rs 
    '  Do While Not .EOF 
    '  Debug.Print ![CompanyName] & " " & ![Postcode] 
    '  .MoveNext 
    '  Loop 
    ' End With 
    End With 
    cnn.Close 
End Sub 

cevap

3

Tamam, bu örneği test ettim. Kurulumunuzda tahmin etmektense, bıraktığım kurulumuma uygun değişiklikleri içeriyor. Bunun büyük kısmı, http://support.microsoft.com/kb/281998/EN-US/

Dim cn As New ADODB.Connection 
Dim cmd As New ADODB.Command 
Dim param1 As New ADODB.Parameter 

    With cn 
     .Provider = "Microsoft.Access.OLEDB.10.0" 
     .Properties("Data Provider").Value = "SQLOLEDB" 
     .Properties("Data Source").Value = "Server" 
     .Properties("Integrated Security").Value = "SSPI" 
     .Properties("Initial Catalog").Value = "Test" 
     .Open 
    End With 

    txtSiteID_Search = 1 

    If Nz(txtSiteID_Search, vbNullString) <> vbNullString Then 
     Set param1 = cmd.CreateParameter("@SiteID", adBigInt, adParamInput) 
     param1.Value = txtSiteID_Search 
     cmd.Parameters.Append param1 
    End If 

    With cmd 
     .ActiveConnection = cn 
     .CommandText = "spSiteInformation_Retrieve" 
     .CommandType = adCmdStoredProc 
     Set Me.Recordset = .Execute 
    End With 
+0

Remou: Güzel, form kayıtları kaynağı olarak bir ADO rs kullanabileceğini düşünmedim. FMY, önerdiğim PTQ çözümüne kıyasla herhangi bir fayda var mı? –

+0

Yardımlarınız için çok teşekkürler ve başkaları .. Bu şimdi iyi çalışıyor .. – winshent

+0

@iDevelop Hiç emin değilim, ama DAO ile yapamayacağınız ADO ile yapabileceğiniz şeyler var. Hem ADO hem de DAO kullanmanın avantajları vardır, bu yüzden her ikisini de kullanmak için Access'i kurmak genellikle iyi bir fikirdir. Ayrıca, geçişli sorgular ODBC kullanır düşünüyorum, ancak OLEDB daha iyi bir performans sunabilir (http://database.ittoolbox.com/documents/odbc-vs-oledb-18150) – Fionnuala

0

: Ben burada

VBA kodu .. bir ADO kayıt kullanarak sonuç aracılığıyla yineleme başarmış, ancak forma sonuçları bağlamak olamaz VBA'da başvuru.

Me.Recordset = .Execute değerini Set Me.Recordset = .Execute olarak değiştirin.

Ayrıca, muhtemelen desteklenen bir imleç türüyle açmanız gerekir. Komut nesnesinde Execute yöntemini kullanırsanız, imleç türünü değiştirmenin bir yolu olduğunu düşünmüyorum. Recordset'i ayrı ayrı oluşturmanız gerekir.

Set rs = New ADODB.Recordset 
rs.Open cmd, , adOpenKeyset 
Set Me.Recordset = rs 
+0

çalıştı alınan başarısız olduğunu .. – winshent

+0

... hata neydi? – Tmdean

+0

Çalışma zamanı hatası '7965' Girdiğiniz nesne geçerli bir Recordset özelliği değil. – winshent

2

ADO'yu unutun. Access ReturnsRecords = True ile Access'te geçiş sorgusu oluşturun.
Formunuzu bu geçiş sorgusuna bağlayın.
VBA kullanarak, bu QueryDef nesnesinin .SQL özelliğini değiştirin ve formu açın. Sen bittin.

Set qry = CurrentDb.QueryDefs("myQryDef") 
qry.SQL = "exec spMyStoredProc " & "'argument1'" 
+0

proje şu anda bir mdb .. ve ben arka uç SQL 2005'e göç ediyorum .. Mümkünse bir mdb olarak tutmak istiyorum .. ADO'da kesinlikle yapılabilir mi? Mdb ile – winshent

+0

normalde DAO kullanıyorsunuz (iyi ... Ben yaparım). Benim çözümüm bir mdb içindir. Formu açtıktan sonra, isterseniz Me.RecordsetClone kullanabilirsiniz. Ancak bunun ADO değil, bir DAO kayıt seti vereceğini unutmayın. –

+0

Access, yerel veri arabirimi olduğu için DAO kayıt kümelerine daha uygundur. ADO, A2000 zaman diliminde aşılandı ve uygun değildi. Aslında bir takım sorunları var. ODBC bağlantılı tabloları kullanıyorsanız, Jet/ACE'den geçersiniz, dolayısıyla bağlantılı herhangi bir tabloda DAO'yu kullanmak istersiniz. Geçiş yolu, Jet/ACE sorgu iyileştiricisini atlar, ancak yine de Jet/ACE ve ODBC'den geçirilir. –