您的位置:首页 > 数据库 > Oracle

VC通过ADO连接到ACCESS,SQLSERVER,ORACLE数据库(一)

2016-09-24 19:49 441 查看

    一.导入ADO库文件

    一般情况下,VC并不支持ADO对象,要在VC中使用ADO接口,需要使用#import命令导入ADO库文件

#import "C:\Program Files\Common Files\System\ADO\msado15.dll" no_namespace rename("BOF", "adoBOF") rename("EOF", "adoEOF")


    二.连接数据库

    ADO库常用的接口有_ConnectionPtr接口,_RecordsetPtr接口和_CommandPtr接口,通常使用这三个接口就可以满足基本的数据库操作。本文更关注于代码层级的实现,关于接口的介绍,将在以后详述。

bool ConnectToSQL()
{
::CoInitialize(NULL);
try
{
m_pConnection.CreateInstance("ADODB.Connection");
/// ACCESS
<span style="background-color: rgb(255, 0, 0);">_bstr_t <span style="color:#ff6666;">strConnect </span>= "DRIVER=Microsoft Access Driver (*.mdb);FIL={MS Access};DBQ=D:\\test.mdb;UID=;";</span>

m_pConnection->Open(strConnect, "", "", adModeUnknown);

if (m_pConnection->State == adStateOpen)
{
std::cout << "connect to access sql successfully" << std::endl;
m_pCommand.CreateInstance("ADODB.Command");
m_pCommand->ActiveConnection = m_pConnection;
return true;
}
return false;
}
catch (_com_error & e)
{
std::cout << e.Description() << std::endl;
return false;
}
}


    如上的代码块是连接Access数据库的代码,由于是使用的ADO接口,所以只需要讲上述代码标红的代码块替换成连接sql server,oracle的代码块即可。

    ORACLE:

_bstr_t strConnect = "Provider=OraOLEDB.Oracle;Password=9999;Persist Security Info=True;\
User ID = sa;  Data Source = \"(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=\
(PROTOCOL=TCP)(HOST=192.168.1.128)(PORT=1521))) (CONNECT_DATA=(SERVICE_NAME=myoracle)))\"";
    SQL SERVER:

_bstr_t strConnect = "Provider=SQLOLEDB.1;Password=5201314;Persist Security Info=True;\
User ID = sa; Initial Catalog = mysystem; Data Source = localhost";


    三.数据库操作

    因为是使用ADO库进行连接,所以除了连接时进行连接的字符串不同,以及支持的SQL语句稍有不同外,其他的操作并无不同,以下的代码不论是ACCESS,ORACLE,SQL SERVER都适用。

    查询数据库:

std::vector<std::list<std::string> > QuerySQL(const char * sql_msg)
{
std::vector <std::list<std::string> >  string_list;
std::list<std::string> record_set;
try
{
m_pCommand->CommandText = (_bstr_t)sql_msg;
m_pRecord = m_pCommand->Execute(NULL, NULL, 0);
if (0 == m_pRecord->GetRecordCount())
return string_list;

m_pRecord->MoveFirst();
while (!m_pRecord->adoEOF)
{
for (int index = 0; index != m_pRecord->Fields->GetCount(); index ++)
{
std::string  tmp = (const char *)_bstr_t(m_pRecord->GetCollect(_variant_t(long(index))));
record_set.push_back(tmp);
}
string_list.push_back(record_set);
record_set.clear();
m_pRecord->MoveNext();
}

}
catch (_com_error & e)
{
std::cout << e.Description() << std::endl;

}

return string_list;

}

    数据库语句支持:

    如上所示,数据库的查询功能完全都是利用ADO的接口实现的,同理,也可以利用这些接口实现数据库的增删改,不过同样的,为了简单起见,对于不需要返回查询结果的操作,我们完全可以使用数据库语句来实现,ADO接口也专门开放了执行SQL语句的功能,如下所示:

bool ExecuteSQL(const char * sql_msg)
{
try
{
m_pCommand->CommandText = (_bstr_t)sql_msg;
m_pCommand->Execute(NULL, NULL, 0);
return true;
}
catch (_com_error & e)
{
std::cout << e.Description() << std::endl;

return false;
}
}


    四.关闭数据库连接

    

</pre><pre name="code" class="cpp">bool CloseSQL()
{
try
{
//m_pRecord->Close();
m_pConnection->Close();

if (m_pConnection->State == adStateClosed)
{
std::cout << "Close SQL successfully" << std::endl;

m_pConnection.Release();
m_pRecord.Release();
m_pCommand.Release();

::CoUninitialize();
return true;
}

return false;
}
catch (_com_error & e)
{
std::cout << e.Description() << std::endl;

return false;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: