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

这篇博客介绍了如何在VC中通过ADO库连接和操作ACCESS、SQLSERVER、ORACLE数据库。首先,文章讲解了如何导入ADO库文件,接着详细阐述了连接数据库的步骤,特别是使用_ConnectionPtr、_RecordsetPtr和_CommandPtr接口。然后,展示了通用的数据库查询和SQL语句支持。最后,讨论了关闭数据库连接的方法,强调了ADO接口在数据库增删改查中的应用。
摘要由CSDN通过智能技术生成


    一.导入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;
	}
}




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值