2011-07-01 11 views
5

आयात और उपयोग कर रहा है मेरे पास सी ++ प्रोजेक्ट में एडीओ आयात और उपयोग करने के दो छोटे प्रश्न हैं। मुझे किसी भी रूप में एडीओ के साथ अनुभव नहीं हुआ है।सी ++ एडीओ

सबसे पहले, मेरे प्रोग्राम के डेटाबेस पहलू होने के समय केवल विंडोज़ पर ही चलने की आवश्यकता है। क्या यह जांचने के लिए पर्याप्त है कि _WIN32 या _WIN64 को एडीओ विशिष्ट कोड चलाने से पहले परिभाषित किया गया है, या क्या बेहतर दृष्टिकोण हैं? मैं अपने कंपाइलर के रूप में विजुअल सी ++ 2010 एक्सप्रेस का उपयोग कर रहा हूं।

दूसरा, मैं अपनी मार्गदर्शिका के रूप में this page का अनुसरण कर रहा हूं। मैंने msado15.dll के लिए #import कथन शामिल किया है। #import निर्देश लाल रेखांकित किया गया है, और जब मैं उस पर होवर करता हूं तो त्रुटि प्राप्त होती है "... स्रोत फ़ाइल पथ/to/msado15.tlh नहीं खोल सकता है," और स्रोत में कॉपी की गई कोई भी एडीओ सामग्री लाल रेखांकित रहती है। मैंने त्रुटि संदेश में सूचीबद्ध निर्देशिका की जांच की है और msado15.tlh है, अगर यह मायने रखता है। साथ ही, प्रोग्राम संकलित करता है (यह निष्पादन के बाद हालांकि दुर्घटनाग्रस्त हो जाता है, लेकिन यह कुछ और है जिसे मैं अलग से निदान करूंगा)।

मैं इस बारे में बहुत अनजान हूं कि यह क्यों हो रहा है। किसी तरह की सहायता या सुझाव की हम सराहना करते हैं।

#import "msado15.dll" rename_namespace("ADO") rename("EOF", "EndOfFile") no_implementation 

में:

+0

क्या आपकी मशीन 32 बिट या 64 बिट है? यदि 64 बिट, आपको प्रोग्राम फ़ाइलों (x86) – crashmstr

+0

पर इंगित करने की आवश्यकता है कृपया निम्नलिखित देखें: https://stackoverflow.com/questions/42036189/msado15-tlh-not-generated-after-importing-msado15-dll/46540869#46540869 – Kamleshwar

+0

कृपया निम्नलिखित देखें: https://stackoverflow.com/questions/42036189/msado15-tlh-not-generated-after-importing-msado15-dll/46540869#46540869 – Kamleshwar

उत्तर

9

जिस तरह से हम यह करने के लिए, हम करने के लिए बाहर कुलपति ++ निर्देशिकाएँ/फ़ाइलें

$(ProgramFiles)\Common Files\System\ado 

और फिर हम इस

शीर्षक में

की तरह आयात शामिल निम्नलिखित जोड़ें सीपीपी फ़ाइल के शीर्ष

#import "msado15.dll" rename_namespace("ADO") rename("EOF", "EndOfFile") implementation_only 

थोड़ा अलग, क्योंकि हम नामस्थान रखना पसंद करते हैं, और एक अलग ईओएफ नाम का उपयोग करते हैं।

C++ Import help on MSDN

C++ Import Attributes on MSDN

+0

मुझे 'नो_मिमेंटेशन' और 'कार्यान्वयन_ऑनली' के बारे में कभी नहीं पता था। मुझे लगता है कि यह इसे संभालने का एक बहुत अच्छा तरीका है, जब वे शामिल होते हैं तो एडीओ के पूर्ण कार्यान्वयन के साथ हेडर फ़ाइलों को खींचने के बजाय अधिक हल्का बनाते हैं। –

+0

मुझे एक ही समस्या है, मैंने इन सभी सुधारों का प्रयास किया है और यह काम नहीं कर रहा है।लेकिन मैं मानता हूं कि इन समाधानों को एक नई परियोजना पर काम करना चाहिए। मैं बस अनुमान लगा रहा हूं कि वीएस 2010 में msado15.dll के साथ कुछ परेशानी है। मैंने वीएस 2003 से 2010 तक एक प्रोजेक्ट को परिवर्तित किया और जब भी मैं इसे संकलित करने का प्रयास करता हूं तो उत्पन्न टीबीएल फ़ाइल में ईओएफ प्रतीक से संबंधित एक बग होता है। स्पष्ट रूप से संकलक नाम मैक्रो प्रतिस्थापन नहीं खरीदता है। मेरे पास यहां एक विषय है http://stackoverflow.com/questions/16715900/converting-application-from-visual-studio-2003-to-visual-studio-2010-ado-c। धन्यवाद! – zlogdan

+0

क्या आप वाकई यह काम करते हैं? devenv.exe एक 32 बिट ऐप है, इसलिए $ (प्रोग्राम फ़ाइलें) पर्यावरण चर हमेशा 32 बिट फ़ोल्डर को इंगित करता है। – Bathsheba

2

मैं जब मैं एडीओ के साथ शुरू किया एक ही समस्या थी। (लाल रेखांकित, नहीं मिल सकता ...) यह मुझे पागल कर देता है लेकिन बस संकलन के बाद, रेखांकन दूर चला गया और सब ठीक काम किया।

मैं अपने शीर्ष लेख में #import "C:\Program\Delade filer\System\ado\msado15.dll" rename_namespace("USEADO"),rename("EOF","EndOfFile") का उपयोग करता हूं।

सीपीपी जैसे में:

#include "stdafx.h" 

int SQLsetInfo(THING *Thing, GADGET *Gadget) 
{ 

HRESULT hr;               
USEADO::_ConnectionPtr connection;         
USEADO::_RecordsetPtr recordset;          

//Initialize COM 
    if(FAILED(hr = CoInitialize(NULL)))       
    { MessageBox(NULL, L"Initialize COM Failed", L"MyProg!",MB_ICONEXCLAMATION |MB_OK); 
     //Do something, eg shut down DB stuff and continue without or exit program 
     //Insert error handeler below 
     return hr;//TODO Ad error handeling see line 149 
    } 

if(FAILED(hr = connection.CreateInstance(__uuidof(USEADO::Connection)))) 
    { MessageBox(NULL, L"Create connection instance Failed", L"MyProg!",MB_ICONEXCLAMATION |MB_OK); 
     //Do something, eg shut down DB stuff and continue without or exit program 
     return hr; 
    } 

if(FAILED(hr = recordset.CreateInstance(__uuidof(USEADO::Recordset)))) 
    { MessageBox(NULL, L"Create recordset instance Failed", L"MyProg!",MB_ICONEXCLAMATION |MB_OK); 
     //Do something, eg shut down DB stuff and continue without or exit program 
     return hr; 
    } 

    connection->CursorLocation = USEADO::adUseServer; //http://dev.mysql.com/tech-resources/articles/vb-cursors-and-locks.html           

    //Try to connect to SQL server 
    try   { connection->Open(L"YOUR CONNECTION STRING", USEADO::adConnectUnspecified); } 
    catch(...) {std::cout << "!!! connection->Open(ConnectionString FAILED !!!" << std::endl;  } 

मैं नहीं सी ++ में एक विशेषज्ञ है, लेकिन यह मेरे लिए ठीक काम करता है। उम्मीद है कि यह आपको मदद करता है। अगर किसी और के पास उपर्युक्त स्निपेट के लिए सुझाव/आलोचक हैं तो मैं इसके लिए तत्पर हूं ....

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