2010-06-28 22 views
5

मैं एक छोटा वीबीस्क्रिप्ट बनाने की कोशिश कर रहा हूं जो एक एमएस एक्सेस 2007 डेटाबेस फ़ाइल को कॉम्पैक्ट करता है।मैं VBscript का उपयोग कर DAO.DBEngine.36 में "कॉम्पैक्टडेटाबेस" का उपयोग क्यों नहीं कर सकता?

कोड रहा है:

Set acc2007 = CreateObject("DAO.DBEngine.36") 
acc2007.CompactDatabase "C:\test.accdb", "C:\test2.accdb", Nothing, Nothing, ";pwd=test" 
Set acc2007 = Nothing

जब मैं एक 32-बिट cmd.exe से "cscript test.vbs" के साथ तीन लाइनों को चलाने मैं इस त्रुटि हो रही है:

सी: \ test.vbs (10, 1) DAO.DbEngine: अपरिचित डेटाबेस प्रारूप 'सी: \ test.accdb'।

डेटाबेस एमएस एक्सेस 2007 के साथ बनाया गया था, जब मैं आइकन को डबल-क्लिक करके खोलता हूं तो मैं पासवर्ड "टेस्ट" टाइप करता हूं और फिर मैं सामान्य रूप से खुलता हूं। यह शीर्ष पर "एक्सेस 2007" कहता है, इसलिए इसका सही प्रारूप है। http://msdn.microsoft.com/en-us/library/bb220986.aspx

वस्तु DAO.DBEngine.36 सफलतापूर्वक के बाद से मुझे लगता है कि लाइन पर किसी भी त्रुटि नहीं मिल रहा है बनाई गई है:

यहाँ समारोह मैं उपयोग करने के लिए कोशिश कर रहा हूँ के प्रलेखन है। क्या गलत हो सकता है?

+1

यही कारण है कि आपको पहले .ldb फ़ाइल (लॉक फ़ाइल) के लिए कोड में जांच करनी चाहिए और केवल तब ही जारी रहें जब यह नहीं मिलता है। – Fionnuala

+0

मैं इसके साथ खुशी से रह सकता हूं। =) चीयर्स। – Mike

उत्तर

6

डीएओ 3.6 नए एसीसीडीबी डेटाबेस प्रारूप का समर्थन नहीं करता है। इसके बजाय DAO.DBEngine.120 आज़माएं।

यहां एक उदाहरण है जो मेरे सिस्टम पर काम करता है।

Dim objFSO 
Dim objEngine 
Dim strLckFile 
Dim strSrcName 
Dim strDstName 
Dim strPassword 

strLckFile = "C:\Access\webforums\foo.laccdb" 
strSrcName = "C:\Access\webforums\foo.accdb" 
strDstName = "C:\Access\webforums\compacted.accdb" 
strBackup = "C:\Access\webforums\foobackup.accdb" 
strPassword = "foo" 

Set objEngine = CreateObject("DAO.DBEngine.120") 

Set objFSO = CreateObject("Scripting.FileSystemObject") 
If Not (objFSO.FileExists(strLckFile)) Then 
    If (objFSO.FileExists(strBackup)) Then 
     objFSO.DeleteFile strBackup 
    End If 
    If (objFSO.FileExists(strDstName)) Then 
     objFSO.DeleteFile strDstName 
    End If 
    objFSO.CopyFile strSrcName, strBackup 

    ''dbVersion120 = 128 
    objEngine.CompactDatabase strSrcName, strDstName, , 128, ";pwd=" & strPassword 

    objFSO.DeleteFile strSrcName 
    objFSO.MoveFile strDstName, strSrcName 
End If 'LckFile 

नोट: मैं कॉम्पैक्ट से पहले अपने डेटाबेस का बैकअप बनाने का फैसला किया। अंत में, मैं मूल (असम्पीडित) डेटाबेस हटा देता हूं और मूल नाम पर कॉम्पैक्ट किए गए नाम का नाम बदलता हूं। यदि आप इसमें रूचि नहीं रखते हैं, तो आप objFSO सामान को हटाकर इसे सरल बना सकते हैं।

संपादित करें: लॉक फ़ाइल की जांच के लिए संशोधित; अगर पाया कुछ भी नहीं।

+0

मैं आपको चुंबन दे सकता हूं, हालांकि मैं आपके हाथ को हिलाकर रखूंगा। :) बहुत बहुत धन्यवाद, यह काम करता है! एक्सेस 2007 डेटाबेस को सफलतापूर्वक संपीड़ित किया गया है और पहले के एक्सेस डेटाबेस (जैसा कि यह अन्य विधियों के साथ होगा) में प्रारूप नहीं बदलता है, और यह एक असंगत स्थिति के साथ डेटाबेस की मरम्मत भी करता है!किसी को भी जो इसे पढ़ता है लेकिन इसे काम नहीं करता है: यदि आप 64 बिट विंडोज़ पर हैं तो स्क्रिप्ट को 32 बिट सेमीडी (SysWOW64 में मिला) के माध्यम से स्क्रिप्ट चलाने के लिए याद रखें। हंसअप फिर से धन्यवाद, यह और अधिक सहायक नहीं हो सकता है। – Mike

3

उपरोक्त आदेश Access 2007 और 2010

के लिए काम नहीं करते हैं विंडोज के सभी संस्करणों 2000 तक वापस जा रहा, और शायद यह भी विंडोज 98, जेट इंजन की एक प्रति, Access 2007 और उससे आगे के लिए के साथ जहाज , यदि आप नए प्रारूप (accdb) का उपयोग कर रहे हैं, तो आपको एसीई नामक जेट इंजन के नए संस्करण का उपयोग करने की आवश्यकता है। ध्यान दें कि यह डेटा इंजन डिफ़ॉल्ट रूप से विंडोज़ पर स्थापित नहीं है, इसलिए आपको इसे Microsoft से डाउनलोड करना होगा।

बेशक यह मानते हुए कि आपके पास पहले से ही 2007 तक स्थापित है, तो आपके पास नया जेट इंजन (एसीई) है और आपको ऊपर उल्लिखित सॉफ़्टवेयर को डाउनलोड और इंस्टॉल करने की आवश्यकता नहीं है।

नई वस्तु नाम आप की जरूरत DAO.DBEngine.120 है, इसलिए करने के लिए अपने कोड बदलने के लिए:

Set acc2007 = CreateObject("DAO.DBEngine.120") 

नोट एक 64 बिट संस्करण भी उपलब्ध है कि।

+0

भी आपको धन्यवाद। – Mike

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