2012-05-05 8 views
5

मैं अपना डेटा लोड होने पर इस डेटा को अपने डेटाशीट सबफ़ॉर्म पर चला रहा हूं और मुझे कोई त्रुटि संदेश या कोड ब्रेक नहीं मिल रहा है। मेरा डीबग.प्रिंट दिखाता है कि रिकॉर्ड्स आरएस 2131 रिकॉर्ड से भरा हुआ है जैसे कि यह होना चाहिए, लेकिन मेरा फॉर्म # नाम के साथ एक पंक्ति दिखाता है? हर क्षेत्र में। मेरे नियंत्रण पर नियंत्रण स्रोत गुण निश्चित रूप से ऊपर सूचीबद्ध फ़ील्ड नामों से मेल खाते हैं। आरएस एक फॉर्म लेवल वैरिएबल है और मैं इसे बंद नहीं कर रहा हूं या फॉर्म बंद होने तक इसे कुछ भी सेट नहीं कर रहा हूं।मेमोरी में, स्टैंड-अलोन, डिस्कनेक्ट किए गए एडीओ रिकॉर्ड्स

कोई विचार क्या मैं गलत कर रहा हूं?

Set rs = New ADODB.Recordset 
rs.Fields.Append "TimesUsed", adInteger 
rs.Fields.Append "strWorkType", adVarWChar, 150 
rs.Fields.Append "DateLastUsed", adDate 
rs.Fields.Append "SelectedYN", adBoolean 
Set rs.ActiveConnection = Nothing 
rs.CursorLocation = adUseClient 
rs.LockType = adLockBatchOptimistic 
rs.Open 

Dim sSQL As String 
sSQL = "MyComplicated SQL Statement Ommitted from this SO Question" 

Dim r As DAO.Recordset 
Set r = CurrentDb.OpenRecordset(sSQL, dbOpenDynaset, dbSeeChanges) 
If Not (r.EOF And r.BOF) Then 
    r.MoveFirst 
    Dim fld 
    Do Until r.EOF = True 
     rs.AddNew 
     For Each fld In r.Fields 
      rs(fld.Name) = r(fld.Name).value 
     Next 
     rs.Update 
     r.MoveNext 
    Loop 
End If 
r.Close 
Set r = Nothing 
Debug.Print rs.RecordCount '2131 records 
Set Me.Recordset = rs 

ठीक है, तो मैं बस this on the MSDN site पढ़ें:

recordset इस तरह के एक मेज के प्राथमिक कुंजी के रूप में एक या अधिक क्षेत्रों की अद्वितीय रूप से अनुक्रमित हैं, शामिल होना चाहिए।

(नोट: यह जानकारी इस संदर्भ में गलत हो रहा है।)

+2

यह एक छोटी सी मेज (4 क्षेत्रों) के बाद rstADO.MoveFirst & rstADO.MoveLast का उपयोग करें। लेकिन मुझे लगता है कि मुझे वास्तव में एंटरप्राइज़ के लिए विकसित नहीं करना पड़ा है, इसलिए मैं डेटाशीट दृश्यों में बड़ी मात्रा में डेटा (10,000 रिकॉर्ड और कभी-कभी अधिक) खींचने के आदी हूं। हमारे सर्वर में गिगाबिट ईथरनेट और तेज़ हार्ड ड्राइव के साथ मुझे अपने उपयोगकर्ताओं से कोई शिकायत नहीं मिलती है, भले ही हम ओडीबीसी लिंक्ड टेबल्स के साथ डीएओ का उपयोग कर रहे हों। इसलिए, मैं वास्तव में अपने दृष्टिकोण को क्षमा नहीं कर रहा हूं जितना कि मैं बस इतना कह रहा हूं कि "अब तक" यह वास्तव में बहुत अच्छी तरह से काम करता है। – HK1

उत्तर

4

मुझे पता चला कि एक ही रास्ता है कि मैं इस कार्य करवा सकते हैं LockType adLockPessimistic या adLockOptimisic उपयोग करने के लिए है। adLockRead केवल स्पष्ट कारणों से काम नहीं करता है और किसी कारण से adLockBatchOptimistic रिकॉर्ड को मेरे रूप में प्रदर्शित करने की अनुमति नहीं देता है, भले ही रिकॉर्डसेट पूरी तरह कार्यात्मक प्रतीत होता है।

मुझे यह भी पता चला कि आपको इस प्रकार के डिस्कनेक्ट किए गए रिकॉर्ड्ससेट के लिए एक फॉर्म से बंधने के लिए प्राथमिक कुंजी परिभाषित करने की आवश्यकता नहीं है। मुझे यकीन है कि आप फॉर्म के माध्यम से रिकॉर्डसेट में कोई संपादन या अपडेट नहीं कर पाएंगे, लेकिन मेरे परीक्षण में मैंने पाया कि मैं इस प्रकार के फॉर्म/रिकॉर्डसेट में कोई भी संपादन नहीं कर सका क्योंकि मुझे त्रुटि 3270 मिल रही थी (एक लापता संपत्ति के साथ कुछ करने के लिए)। यह वास्तव में इस सवाल के दायरे से बाहर है।

यहाँ एक काम में स्मृति recordset बनाने के लिए आवश्यक कोड की न्यूनतम राशि है:

Dim rs As ADODB.Recordset 'Form Level variable 

Private Sub Form_Load() 
    Set rs = New ADODB.Recordset 
    rs.Fields.Append "ID", adInteger 
    'Set rs.ActiveConnection = Nothing 'Not Required 
    'rs.CursorType = adOpenKeyset 'Not Required 
    'rs.CursorLocation = adUseClient 'Not Required 
    rs.LockType = adLockPessimistic 'May also use adLockOptimistic 
    rs.Open 

    Dim i as Integer 

    For i = 1 To 10 
     rs.AddNew 
     rs("ID").Value = i 
     rs.Update 
    Next i 

    Set Me.Recordset = rs 
End Sub 

यह पहली बार मेरे लिए ये लगता था कि कट recordset के इस प्रकार के लिए एक फार्म (मेरे मामले में डेटापत्रक दृश्य) बाध्यकारी होगा मेरी विशेष जरूरतों के लिए एक अच्छा, सरल समाधान बनें। हालांकि, मैं कई समस्याओं में भाग गया। जब आपका फॉर्म एडीओ रिकॉर्डसेट से जुड़ा होता है तो डिफ़ॉल्ट फॉर्म सॉर्टिंग काम नहीं करती है। इसके अलावा, किसी कारण से मैं इस रिकॉर्डसेट को संपादन योग्य/अद्यतन करने योग्य नहीं पाया जो मेरी आवश्यकताओं के लिए एक आवश्यकता थी (मैं मूल रूप से इसे बहु-चेक सूची के रूप में उपयोग कर रहा था)। यदि आप किसी तालिका से रिकॉर्डसेट प्राप्त करते हैं (भले ही यह एक खाली तालिका है) और फिर डिस्कनेक्ट करें, तो आप इस समस्या के आसपास काम कर सकते हैं। स्पष्ट रूप से तालिका किसी प्रकार की संरचना या गुणों की आपूर्ति करती है जो मैं ऊपर दिए गए कोड में सेट करने में विफल रहा हूं, जब मैं रिकॉर्ड जोड़ने/संपादित करने का प्रयास करता हूं तो मुझे 3270 त्रुटि संदेश का निर्धारण होता है। और मैंने यह नहीं पता लगाया है कि वे गुण क्या हैं या उन्हें कैसे सेट करें।

निष्कर्ष में, मुझे लगता है कि मैं एक एक्सेस "temp" तालिका का उपयोग करने का सहारा लेगा क्योंकि यह कम जटिल होगा और मुझे ऊपर सूचीबद्ध समस्याओं को नहीं मिला है।

+0

पिछले दिनों में, मुझे एक सरल, इन-मेमोरी डेटासेट बनाने की समान इच्छा थी। मुझे भी इसी तरह की निराशा हुई और साथ ही छोड़ दिया। –

7

यह संभव सेटअप करने के लिए एक recordset है कि केवल एक में स्मृति वस्तु है पर एक प्राथमिक कुंजी है?

हां, adFldKeyColumnAttrib के रूप में Append Method पर उपयोग करें। अधिक जानकारी के लिए FieldAttributeEnum पढ़ें।

यदि आपके पास पहले से ही आपके SQL कथन से उपयुक्त एक उपयुक्त अद्वितीय फ़ील्ड (या फ़ील्ड का संयोजन) है, तो इसका उपयोग करें। यदि नहीं, तो एक लंबा पूर्णांक फ़ील्ड बनाएं और इसे नकली प्राथमिक कुंजी फ़ील्ड के रूप में उपयोग करें ... आपके द्वारा डाली गई प्रत्येक पंक्ति के मान को बढ़ाएं।

rs.Fields.Append "pkey", adInteger, , adFldKeyColumn 

भी देखें, तो डैनी Lesandrini द्वारा डाटाबेस जर्नल से इस लेख उपयोगी है: Create In-Memory ADO Recordsets

+0

ठीक है, इसलिए मैंने ऊपर सुझाए गए प्राथमिक कुंजी फ़ील्ड को जोड़ा है, और मैंने इसे पॉप्युलेट किया है लेकिन मैं अभी भी # नाम देख रहा हूं? मेरे सभी क्षेत्रों में। मैं परेशान हूँ – HK1

4

नोट: मैं Create In-Memory ADO Recordsets फिर से ऊपर दिखाए गए उदाहरण का उपयोग करके नए रिकॉर्ड डालने के साथ-साथ सही ढंग से काम करने के लिए बदल रहा है रूपों कोड के लिए निम्न सब कुछ प्राप्त करने में सक्षम था ... 'नोट: चाल के लिए गया था rstADO.Update

Option Compare Database 
Dim rstADO As ADODB.Recordset 
Dim lngRecordID As Long 

Private Sub Form_BeforeInsert(Cancel As Integer) 

    lngRecordID = lngRecordID + 1 
    rstADO.AddNew 
    rstADO("EmployeeID").value = lngRecordID 
    rstADO.Update 
    rstADO.MoveFirst 
    rstADO.MoveLast 

End Sub 

Private Sub Form_Load() 

    Dim fld As ADODB.Field 

    Set rstADO = New ADODB.Recordset 
    With rstADO 
     .Fields.Append "EmployeeID", adInteger, , adFldKeyColumn 
     .Fields.Append "FirstName", adVarChar, 10, adFldMayBeNull 
     .Fields.Append "LastName", adVarChar, 20, adFldMayBeNull 
     .Fields.Append "Email", adVarChar, 64, adFldMayBeNull 
     .Fields.Append "Include", adInteger, , adFldMayBeNull 
     .Fields.Append "Selected", adBoolean, , adFldMayBeNull 

     .CursorType = adOpenKeyset 
     .CursorLocation = adUseClient 
     .LockType = adLockPessimistic 
     .Open 
    End With 
    Set Me.Recordset = rstADO 

End Sub 

Private Sub Form_Unload(Cancel As Integer) 

    Set rstADO = Nothing 

End Sub 
संबंधित मुद्दे