如何用VC++访问SQLserver数据库?
解决方案 »
- 【MFC求助】定义返回值为对象指针的函数出现错误
- 我在excel上自定义了一些菜单和按钮,现在要给这些菜单和按钮添加响应函数,我该怎么写?大家给点提示了!!!
- 串口通信:在VC下如何控制一个开关
- 输入选择提示窗口,就像VC编程时候输入OBJECT->,然后在->地方弹出的哪个选择窗口
- *** 快速解帖: XML 如何获取 某个节点 的路径 ***
- 如何调用mschart?
- 请教:AddNew()函数......从小函数深入了解RecordSet
- 如何取得系统版本信息,如何区分windows系统是professional还是server
- 求助怎么把多个bmp合成一个gif动画。
- 请问这有什么区别?
- outlook2007开发,如何给每一个打开的inspector添加事件连接?
- 如何通过程序将休眠状态的电脑唤醒?
2. 可以使用ATL提供的CSession、CCommand等类库,基于OLEDB Consumer技术;
http://www.vckbase.com/document/viewdoc/?id=1215
http://www.vckbase.com/document/viewdoc/?id=610
http://www.vckbase.com/document/viewdoc/?id=496
http://www.cnblogs.com/cy163/archive/2007/03/29/693369.html 看完上面两篇文章应该就没问题了
一篇理论,一篇例程
// 初始化COM动态链接库
::CoInitialize(NULL); // 创建ADO连接对象和记录集对象
_ConnectionPtr pConnection = NULL;
_RecordsetPtr pRecordset = NULL;
pConnection.CreateInstance(__uuidof(Connection));
pRecordset.CreateInstance(__uuidof(Recordset)); // 获得当前应用程序的路径
TCHAR szFileName[MAX_PATH];
::GetModuleFileName(AfxGetInstanceHandle(), szFileName, MAX_PATH);
CString strPath = szFileName;
strPath = strPath.Left(strPath.ReverseFind(TEXT('\\')) + 1); // 包含'\'字符 try
{
// 打开本地的Access数据库
CString strConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strPath + "test.mdb";
pConnection->Open(strConnection.GetBuffer(200), "", "", adModeUnknown);
strConnection.ReleaseBuffer(); // 访问Student表中所有的记录,并输出到屏幕上
pRecordset->Open("Select * From Student Where [Age] > 19", pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText);
pRecordset->MoveFirst();
while (pRecordset->EndOfFile == VARIANT_FALSE)
{
// 第一个字段
COleVariant vaHolder = pRecordset->GetCollect("Name");
if (vaHolder.vt != VT_NULL)
{
CString strName = (LPCWSTR)_bstr_t(vaHolder);
cout << strName.GetBuffer(50) << ", ";
strName.ReleaseBuffer();
}
vaHolder.Clear(); // 第二个字段
vaHolder = pRecordset->GetCollect("Age");
if (vaHolder.vt != VT_NULL)
{
int age = (int)vaHolder.intVal;
cout << age << endl;
}
vaHolder.Clear(); pRecordset->MoveNext();
}
pRecordset->Close();
}
catch (_com_error e)
{
AfxMessageBox(e.ErrorMessage());
} // 关闭记录集和连接对象
if (pRecordset->State)
pRecordset->Close();
if (pConnection->State)
pConnection->Close(); // 关闭COM库的支持
::CoUninitialize();
新建连接类如下(类名:ADOConn)
// ADOConn.cpp: implementation of the ADOConn class.
//
//////////////////////////////////////////////////////////////////////#include "stdafx.h"
#include "CheckManage.h"
#include "ADOConn.h"#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////ADOConn::ADOConn()
{}ADOConn::~ADOConn()
{}// 初始化—连接数据库
void ADOConn::OnInitADOConn()
{
// 初始化OLE/COM库环境
::CoInitialize(NULL);
try
{
// 创建Connection对象
m_pConnection.CreateInstance("ADODB.Connection");
// 设置连接字符串,必须是BSTR型或者_bstr_t类型
_bstr_t strConnect = "Provider=SQLOLEDB.1; Server=127.0.0.1; Database=CheckManage; uid=sa; Trusted_Connection=Yes";
m_pConnection->Open(strConnect,"","",adModeUnknown);
}
// 捕捉异常
catch(_com_error e)
{
// 显示错误信息
AfxMessageBox(e.Description());
}
}// 执行查询
_RecordsetPtr& ADOConn::GetRecordSet(_bstr_t bstrSQL)
{
try
{
// 连接数据库,如果Connection对象为空,则重新连接数据库
if(m_pConnection==NULL)
OnInitADOConn();
// 创建记录集对象
m_pRecordset.CreateInstance(__uuidof(Recordset));
// 取得表中的记录
m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
}
// 捕捉异常
catch(_com_error e)
{
// 显示错误信息
AfxMessageBox(e.Description());
}
// 返回记录集
return m_pRecordset;
}// 执行SQL语句,Insert Update _variant_t
BOOL ADOConn::ExecuteSQL(_bstr_t bstrSQL)
{
// _variant_t RecordsAffected;
try
{
// 是否已经连接数据库
if(m_pConnection == NULL)
OnInitADOConn();
// Connection对象的Execute方法:(_bstr_t CommandText,
// VARIANT * RecordsAffected, long Options )
// 其中CommandText是命令字串,通常是SQL命令。
// 参数RecordsAffected是操作完成后所影响的行数,
// 参数Options表示CommandText的类型:adCmdText-文本命令;adCmdTable-表名
// adCmdProc-存储过程;adCmdUnknown-未知
m_pConnection->Execute(bstrSQL,NULL,adCmdText);
return true;
}
catch(_com_error e)
{
AfxMessageBox(e.Description());
return false;
}
}// 断开连接
void ADOConn::ExitConnect()
{
// 关闭记录集和连接
if (m_pRecordset != NULL)
m_pRecordset->Close();
m_pConnection->Close();
// 释放环境
::CoUninitialize();
}再在ADOConn.h的头文件中加
#import "c:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF") rename("BOF","adoBOF")
并声明一下东西:
// 定义变量
public:
//添加一个指向Connection对象的指针:
_ConnectionPtr m_pConnection;
//添加一个指向Recordset对象的指针:
_RecordsetPtr m_pRecordset;
// 定义方法
public:
ADOConn();
virtual ~ADOConn();
void OnInitADOConn(); // 初始化—连接数据库
_RecordsetPtr& GetRecordSet(_bstr_t bstrSQL); // 执行查询
BOOL ExecuteSQL(_bstr_t bstrSQL); // 执行SQL语句,Insert Update _variant_t
void ExitConnect(); // 断开连接
图书馆找本书或摆渡一下就有答案