2011-07-01 37 views
5

我有两个简短的问题涉及在C++项目中导入和使用ADO。我没有任何形式的ADO经验。C++导入和使用ADO

首先,我的程序的数据库方面暂时只需要在Windows上运行。在运行ADO特定代码之前测试_WIN32或_WIN64是否足以测试,还是有更好的方法?我正在使用Visual C++ 2010 Express作为我的编译器。

二,我跟着this page作为我的导游。我已经包含msado15.dll的#import语句。 #import指令加下划线为红色,当我将鼠标悬停在它上面时收到的错误显示“...无法打开源文件路径/ to/msado15.tlh”,并且我将任何复制到源代码中的ADO内容保留为红色下划线。我已经检查了错误消息中列出的目录,并且msado15.tlh在那里,如果有的话。此外,该程序编译(它执行后崩溃,但这是别的我会分开诊断)。

对于这种情况发生的原因我非常无知。任何帮助或建议,将不胜感激。

+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

我们做事的方法,我们以下内容添加到了VC++目录/包括文件

$(ProgramFiles)\Common Files\System\ado 

然后我们导入像头中具有此

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

在cpp文件的顶部

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

有点不同,因为我们更喜欢保留名称空间,并使用不同的EOF重命名。

C++ Import help on MSDN

C++ Import Attributes on MSDN

+0

我从来不知道'no_implementation'和'implementation_only'。我认为这是一个非常好的处理方式,使头文件变得更轻,而不是在包含ADO的完整实现时拖拽。 –

+0

我有一个类似的问题,我已经尝试了所有这些修补程序,它是行不通的。但我同意这些解决方案应该适用于一个新项目。我只是猜测VS 2010对msado15.dll有点麻烦。我将项目从VS 2003转换为2010,每当我尝试编译它时,生成的tbl文件都有一个与EOF符号相关的错误。显然,编译器不会购买重命名宏替代。我在这里有一个主题http://stackoverflow.com/questions/16715900/converting-application-from-visual-studio-2003-to-visual-studio-2010-ado-c。谢谢! – zlogdan

+0

你确定这可以吗? devenv.exe是一个32位应用程序,因此$(Program Files)环境变量始终指向32位文件夹。 – Bathsheba

2

我有同样的问题,当我开始使用ADO。 (红色下划线,找不到...) 它驱使我坚果,但在编译后,下划线消失了,一切正常。我使用 #import "C:\Program\Delade filer\System\ado\msado15.dll" rename_namespace("USEADO"),rename("EOF","EndOfFile") 在我的头。

在CPP例如:

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

在C++方面的专家,但是这个工作正常,我。希望它可以帮助你。如果任何人在这里有建议/评论家上面的代码中,我期待着它....