日期:2014-05-16  浏览次数:20442 次

VC++连接SQL数据库,并获取相应查询内容

前几天用VC++,获取SQL中的内容并保存,由于不是很熟悉,走了很多弯路,现在总结哈,希望能给需要的人一些帮助。

 

直接贴代码。

#include "string"
#include "map"

//连接SQL引用的
#import "C:\Program Files\Common Files\System\ado\msado15.dll"no_namespace rename("EOF","ADOEOF")

using namespace std;

//你自己定义的函数
void XXXDlg::YourFun() 
{
	// TODO: Add your control notification handler code here
	::CoInitialize(NULL);
	_ConnectionPtr m_pConnection("ADODB.Recordset");
	_RecordsetPtr m_pRecordset("ADODB.Recordset");
	_CommandPtr m_pCommand;

	//连接数据库信息,写在ini文件中的,filepath是ini文件的路径
	//ini文件内容:
	//[Info]
	//Database = driver={SQL Server};Server=数据库电脑ip地址(比如本机127.0.0.1),1433;Database=数据库名称;
	//name = 数据库名字
	//pwd = 你的数据库密码
	//filepath1 = F:/
	//filepath2 = .txt
	CString Database;
	GetPrivateProfileString("Info", "Database", "", Database.GetBuffer(MAX_PATH), MAX_PATH, filepath);
	
	//将获取的数据库链接字段,转换成指定格式
	_bstr_t strConnect = Database;
	
	//数据库连接
	try
	{
		m_pConnection.CreateInstance(__uuidof(Connection));
		CString name;
		CString pwd;
		GetPrivateProfileString("Info", "name", "", name.GetBuffer(MAX_PATH), MAX_PATH, filepath);
		GetPrivateProfileString("Info", "pwd", "", pwd.GetBuffer(MAX_PATH), MAX_PATH, filepath);
		_bstr_t name1 = name;
		_bstr_t pwd1 = pwd;
		HRESULT ConnectResult = m_pConnection->Open(strConnect,name1,pwd1,adModeUnknown);
		if(SUCCEEDED(ConnectResult))
		{
			MessageBox("连接数据库成功!");
		}
		
	}
	catch(_com_error e)
	{
		MessageBox("连接数据库失败!");
		return;
	}
	
	//查询相关内容信息
	try
	{
		_bstr_t CommandText = "select a.字段1,b.字段2,b.字段3,b.字段4 from 表名1 a,表名2 b where 相关条件";

		//m_pConnection->Execute(CommandText, NULL, adCmdText);
		m_pRecordset.CreateInstance(__uuidof(Recordset));
		m_pRecordset->Open(CommandText, m_pConnection.GetInterfacePtr(), 
			adOpenDynamic, adLockOptimistic, adCmdText);

		_variant_t 字段1Result;
		_variant_t 字段2Result;
		_variant_t 字段3Result;
		_variant_t 字段4Result;

		//我是将读出来的信息,保存到txt文件中
		//下面是从ini文件中读取保存文件的地址
		CString filepath1;
		CString filepath2;
		GetPrivateProfileString("Info", "filepath1", "", filepath1.GetBuffer(MAX_PATH), MAX_PATH, filepath);
		GetPrivateProfileString("Info", "filepath2", "", filepath2.GetBuffer(MAX_PATH), MAX_PATH, filepath);
		string m1 = filepath1.GetBuffer(0);
		string m2 = filepath2.GetBuffer(0);
		CString m3 = m1.c_str();
		CString m4 = m2.c_str();		
	
		//定义一个map容器以免,重复操作文件的打开关闭操作
		map<string, auto_ptr<CStdioFile> > filename;
		//遍历查询结果,并保存
		while(!m_pRecordset->ADOEOF)
		{		
			字段1Result = m_pRecordset->GetCollect("字段1");
			CString 字段1Results;
			字段Results=(LPCSTR)_bstr_t(字段1Result);
			CString fileEnd = m3 + 字段1Results + m4;
		
			//我是以 字段1 为文件名保存其他三个字段的内容
			CStdioFile* pfile = NULL;	
			if(filename.find((LPCSTR)fileEnd)!=filename.end())
			{
				pfile = filename[(LPCSTR)fileEnd].get();
			}
			else
			{
				pfile = new CStdioFile(fileEnd,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite);
				filename[(LPCSTR)fileEnd] = auto_ptr<CStdioFile>(pfile);
			}

			字段2Result = m_pRecordset->GetCollect("字段2");
			CString 字段2Results;
			字段2Results=(LPCSTR)_bstr_t(字段2Result);	
			pfile->SeekToEnd();//先定位到文件尾部
			pfile->WriteString(字段2Results);//写入文件	
			pfile->WriteString("\t");//每个字段内容用talbe键分开
				
			字段3Result = m_pRecordset->GetCollect("字段3");
			CString 字段3Results;
			字段3Results=(LPCSTR)_bstr_t(字段3Result);
			pfile->SeekToEnd();//先定位到文件尾部
			pfile->WriteString(字段3Results);	
			pfile->WriteString("\t");
				
			字段4Result = m_pRecordset->GetCollect("字段4");
			CString 字段4Results;
			字段4Results=(LPCSTR)_bstr_t(字段4Result);
			pfile->SeekToEnd();//先定位到文件尾部
			pf