2011-07-01 17 views
5

Tôi có hai câu hỏi ngắn liên quan đến nhập và sử dụng ADO trong dự án C++. Tôi không có kinh nghiệm với ADO dưới mọi hình thức.C++ nhập và sử dụng ADO

Trước tiên, hiện tại, khía cạnh cơ sở dữ liệu của chương trình của tôi chỉ cần chạy trên Windows. Có đủ để kiểm tra nếu _WIN32 hoặc _WIN64 được xác định trước khi chạy mã cụ thể của ADO hay không hoặc có cách tiếp cận tốt hơn không? Tôi đang sử dụng Visual C++ 2010 Express như trình biên dịch của tôi.

Thứ hai, tôi đang theo dõi this page làm hướng dẫn của mình. Tôi đã bao gồm câu lệnh #import cho msado15.dll. Chỉ thị #import được gạch dưới màu đỏ và lỗi tôi nhận được khi di chuột qua nó nói "... không thể mở đường dẫn tệp nguồn/đến/msado15.tlh" và bất kỳ nội dung ADO nào mà tôi sao chép vào nguồn vẫn được gạch dưới màu đỏ. Tôi đã kiểm tra các thư mục được liệt kê trong thông báo lỗi và msado15.tlh là có, nếu đó là vấn đề. Ngoài ra, chương trình biên dịch (nó sụp đổ mặc dù sau khi thực hiện, nhưng đó là cái gì khác tôi sẽ chẩn đoán riêng).

Tôi khá thất vọng về lý do điều này xảy ra. Bất kỳ trợ giúp hoặc cố vấn sẽ được đánh giá cao.

+0

Máy của bạn có 32 bit hoặc 64 bit không? Nếu 64bit, bạn cần phải trỏ đến Program Files (x86) – crashmstr

+0

Vui lòng tham khảo những điều sau đây: https://stackoverflow.com/questions/42036189/msado15-tlh-not-generated-after-importing-msado15-dll/46540869#46540869 – Kamleshwar

+0

Vui lòng tham khảo những điều sau đây: https://stackoverflow.com/questions/42036189/msado15-tlh-not-generated-after-importing-msado15-dll/46540869#46540869 – Kamleshwar

Trả lời

9

Cách chúng tôi làm điều đó, chúng ta thêm dòng sau vào ra VC++ Thư mục/Bao gồm các file

$(ProgramFiles)\Common Files\System\ado 

Và sau đó chúng tôi nhập khẩu như thế này

trong tiêu đề:

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

Tại đầu tệp cpp

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

Một chút khác biệt, vì chúng tôi muốn giữ không gian tên và sử dụng một cách đổi tên EOF khác.

C++ Import help on MSDN

C++ Import Attributes on MSDN

+0

Tôi chưa bao giờ biết về 'no_implementation' và' implementation_only'. Tôi nghĩ rằng đó là một cách rất tốt đẹp để xử lý nó, làm cho tập tin tiêu đề nhẹ hơn nhiều hơn là kéo dọc theo việc thực hiện đầy đủ của ADO khi chúng được bao gồm. –

+0

Tôi gặp vấn đề tương tự, tôi đã thử tất cả các bản sửa lỗi này và nó không hoạt động.Nhưng tôi đồng ý rằng những giải pháp này nên hoạt động trên một dự án mới. Tôi chỉ đoán rằng VS 2010 có một chút rắc rối với msado15.dll. Tôi đã chuyển đổi một dự án từ VS 2003 sang 2010 và bất cứ khi nào tôi cố gắng biên dịch nó, tệp tbl được tạo có lỗi liên quan đến biểu tượng EOF. Rõ ràng trình biên dịch không mua thay thế macro đổi tên. Tôi có một chủ đề ở đây http://stackoverflow.com/questions/16715900/converting-application-from-visual-studio-2003-to-visual-studio-2010-ado-c. Cảm ơn! – zlogdan

+0

Bạn có chắc chắn rằng nó hoạt động không? devenv.exe là một ứng dụng 32 bit, do đó biến môi trường $ (Program Files) luôn trỏ đến thư mục 32 bit. – Bathsheba

2

tôi đã cùng một vấn đề khi tôi bắt đầu với ADO. (đỏ gạch dưới, không thể tìm thấy ...) Nó lái xe cho tôi hạt nhưng sau khi biên dịch đơn giản, gạch dưới đã biến mất và mọi thứ hoạt động tốt.

Tôi sử dụng #import "C:\Program\Delade filer\System\ado\msado15.dll" rename_namespace("USEADO"),rename("EOF","EndOfFile") trong tiêu đề của tôi.

Trong cpp ví dụ:

#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;  } 

Tôi không một chuyên gia trong C++, nhưng điều này hoạt động tốt đối với tôi. Hy vọng nó sẽ giúp bạn. Nếu bất kỳ ai khác ở đây có đề xuất/phê bình về đoạn mã trên, tôi mong chờ nó ....

Các vấn đề liên quan