嘿嘿,C++我也是学到了些基础,今天想做一个小工程,需要连接数据库类
Integrated Security=SSPI好像是windows身份验证吧,你之后的"User ID=sa;pwd=;"则是SQL Server身份验证,试一下去除"Integrated Security=SSPI
VC++下使用ADO编写数据库程序
准备:
(1)、引入ADO类
#import "c:\program files\common files\system\ado\msado15.dll" \
no_namespace \
rename ("EOF", "adoEOF")
(2)、初始化COM
在MFC中可以用AfxOleInit();非MFC环境中用:
CoInitialize(NULL);
CoUnInitialize();
(3)#import 包含后就可以用3个智能指针了:_ConnectionPtr、_RecordsetPtr和_CommandPtr
1.连接和关闭数据库 (1)连接
例子:连接Access数据库
AfxOleInit();//初始化
HRESULT hr;
try
{
hr = m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象
if(SUCCEEDED(hr))
{
m_pConnection->ConnectionTimeout = 0;
hr = m_pConnection->Open( "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db.mdb", "", "", adModeUnknown);
//m_pConnection->PutDefaultDatabase ((_bstr_t)"DB");//设置默认数据库
m_pCommand.CreateInstance(__uuidof(Command));
m_pCommand->CommandTimeout = 5;
m_pCommand->ActiveConnection = m_pConnection;
}
}
catch(_com_error e)///捕捉异常
{
CString errormessage;
errormessage.Format("连接数据库失败!\r\n错误信息:%s",e.ErrorMessage());
AfxMessageBox(errormessage);///显示错误信息
}
(2)、关闭
//如果数据库连接有效
if( m_pConnection->State )
m_pConnection->Close();
m_pConnection = NULL;
(3)、设置连接时间 //设置连接时间-----------------------------------
pConnection->put_ConnectionTimeout(long(5));
2.打开一个结果集
(1)打开,首先创建一个_RecordsetPtr实例,然后调用Open()得到一条SQL语句的执行结果
_RecordsetPtr m_pRecordset;
m_pRecordset.CreateInstance(__uuidof(Recordset));
// 在ADO操作中建议语句中要常用try...catch()来捕获错误信息,
// 因为它有时会经常出现一些意想不到的错误。jingzhou xu
try
{
m_pRecordset->Open("SELECT * FROM DemoTable",// 查询DemoTable表中所有字段
m_pConnection.GetInterfacePtr(), // 获取库接库的IDispatch指针
adOpenDynamic,
adLockOptimistic,
adCmdText);
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
(2)关闭结果集 m_pRecordset->Close();
3.操作一个结果集
(1)、遍历(读取)
a)、用pRecordset->adoEOF来判断数据库指针是否已经移到结果集的末尾了;m_pRecordset->BOF判断是否 在第一条记录前面: while(!m_pRecordset->adoEOF)
{
var = m_pRecordset->GetCollect("Name");
if(var.vt != VT_NULL)
strName = (LPCSTR)_bstr_t(var);
var = m_pRecordset->GetCollect("Age");
if(var.vt != VT_NULL)
strAge = (LPCSTR)_bstr_t(var);
m_AccessList.AddString( strName + " --> "+strAge );
m_pRecordset->MoveNext();
}
b)、取得一个字段的值的办法有两种办法
一是
//表示取得第0个字段的值 m_pRecordset->GetCollect("Name");
或者 m_pRecordset->GetCollect(_variant_t(long(0));
二是
pRecordset->get_Collect("COLUMN_NAME");
或者 pRecordset->get_Collect(long(index));
(2)、添加
a)、调用m_pRecordset->AddNew();
b)、调用m_pRecordset->PutCollect();给每个字段赋值
c)、调用m_pRecordset->Update();确认
(3)、修改
(4)、删除
a)、把记录指针移动到要删除的记录上,然后调用Delete(adAffectCurrent) try
{
// 假设删除第二条记录
m_pRecordset->MoveFirst();
m_pRecordset->Move(1);
// 从0开始
m_pRecordset->Delete(adAffectCurrent);
// 参数adAffectCurrent为删除当前记录
m_pRecordset->Update();
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
4.直接执行SQL语句,除了要用到结果集其余的大部分功能都可以直接用SQL语言实现
(1)、用_CommandPtr和_RecordsetPtr配合
_CommandPtr m_pCommand;
m_pCommand.CreateInstance(__uuidof(Command));
// 将库连接赋于它
m_pCommand->ActiveConnection = m_pConnection;
// SQL语句
m_pCommand->CommandText = "SELECT * FROM DemoTable";
// 执行SQL语句,返回记录集
m_pRecordset = m_pCommand->Execute(NULL, NULL,adCmdText);
(2)、直接用_ConnectionPtr执行SQL语句
_RecordsetPtr Connection15::Execute ( _bstr_t CommandText,
VARIANT * RecordsAffected,
long Options )
其中CommandText是命令字串,通常是SQL命令。
参数RecordsAffected是操作完成后所影响的行数,
参数Options表示CommandText中内容的类型,Options可以取如下值之一:
adCmdText:表明CommandText是文本命令
adCmdTable:表明CommandText是一个表名
adCmdProc:表明CommandText是一个存储过程
adCmdUnknown:未知
例子:
_variant_t RecordsAffected;
m_pConnection->Execute("UPDATE users SET old = old+1",&RecordsAffected,adCmdText);
5.调用存储过程
(1)、利用_CommandPtr
_CommandPtr m_pCommand;
m_pCommand.CreateInstance(__uuidof(Command));
m_pCommand->ActiveConnection = m_pConnection; // 将库连接赋于它
m_pCommand->CommandText = "Demo";
m_pCommand->Execute(NULL,NULL, adCmdStoredProc);
(2)、直接用_ConnectionPtr直接调用(见4.(2))
6.遍历数据库中的所有表名 _ConnectionPtr m_pConnect;
_RecordsetPtr pSet;
HRESULT hr;
try
{
hr = m_pConnect.CreateInstance("ADODB.Connection");
if(SUCCEEDED(hr))
{
CString dd;
dd.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s",file);
hr = m_pConnect->Open((_bstr_t)dd,"","",adModeUnknown);
pSet = m_pConnect->OpenSchema(adSchemaTables);
while(!(pSet->adoEOF))
{
//获取表格
_bstr_t table_name = pSet->Fields->GetItem("TABLE_NAME")->Value;
//获取表格类型
_bstr_t table_type = pSet->Fields->GetItem("TABLE_TYPE")->Value;
//过滤一下,只输出表格名称,其他的省略
if ( strcmp(((LPCSTR)table_type),"TABLE")==0){
CString tt;
tt.Format("%s",(LPCSTR)table_name);
AfxMessageBox(tt);
}
pSet->MoveNext();
}
pSet->Close();
}
m_pConnect->Close();
}catch(_com_error e)///捕捉异常
{
CString errormessage;
errormessage.Format("连接数据库失败!rn错误信息:%s",e.ErrorMessage());
AfxMessageBox(errormessage);
return -1;
}
7.遍历一个表中的所有字段
Field * field = NULL;
HRESULT hr;
Fields * fields = NULL;
hr = m_pRecordset->get_Fields (&fields); //得到记录集的字段集和
if(SUCCEEDED(hr))
fields->get_Count(&ColCount);
//得到记录集的字段集合中的字段的总个数
for(i=0;iItem[i]->get_Name(&bstrColName); //得到记录集//中的字段名
strColName=bstrColName;
nameField = strColName;
m_FieldsList.AddString(nameField);
}
if(SUCCEEDED(hr))
fields->Release();//释放指针
附:
1、_variant_t
(1)、一般传给这3个指针的值都不是MFC直接支持的数据类型,而要用_variant_t转换一下
_variant_t(XX)可以把大多数类型的变量转换成适合的类型传入:
(2)、_variant_t var;_variant_t -> long: (long)var;
_variant_t -> CString: CString strValue = (LPCSTR)_bstr_t(var);
CString -> _variant_t: _variant_t(strSql);
2、BSTR宽字符串与CString相互转换
BSTR bstr;
CString strSql;
CString -> BSTR: bstr = strSql.AllocSysString();
BSTR -> CString: strSql = (LPCSTR)bstr;
3、_bstr_t与CString相互转换
_bstr_t bstr;
CString strSql;
CString -> _bstr_t: bstr = (_bstr_t)strSql;
_bstr_t -> CString: strSql = (LPCSTR)bstr;
4、关于时间
Access:表示时间的字符串#2004-4-5#
Sql:表示时间的字符串''2004-4-5''
DateField(时间字段) select * from my_table where DateField > #2004-4-10#
try
{
m_pCommand->CommandText = "INSERT INTO tTest(age) VALUES('23f2') ";
m_pRecordset = m_pCommand->Execute(NULL,NULL, adCmdText);
}
catch(_com_error e)///捕捉异常
{
CString errormessage;
errormessage.Format("连接数据库失败!\r\n错误信息:%s",e.ErrorMessage());
AfxMessageBox(errormessage);///显示错误信息
}
Top
ODBC链接
适合数据库类型 链接方式
access "Driver={microsoft access driver(*.mdb)};dbq=*.mdb;uid=admin;pwd=pass;"
dBase "Driver={microsoft dbase driver(*.dbf)};driverid=277;dbq=------------;"
Oracle "Driver={microsoft odbc for oracle};server=oraclesever.world;uid=admin;pwd=pass;"
MSSQL server "Driver={sql server};server=servername;database=dbname;uid=sa;pwd=pass;"
MS text "Driver={microsoft text driver(*.txt; *.csv)};dbq=-----;extensions=asc,csv,tab,txt;Persist SecurityInfo=false;"
Visual Foxpro "Driver={microsoft Visual Foxpro driver};sourcetype=DBC;sourceDB=*.dbc;Exclusive=No;"
MySQL "Driver={mysql};database=yourdatabase;uid=username;pwd=yourpassword;option=16386;"
OLEDB链接
适合的数据库类型 链接方式
access "Provider=microsoft.jet.oledb.4.0;data source=your_database_path;user id=admin;password=pass;"
Oracle "Provider=OraOLEDB.Oracle;data source=dbname;user id=admin;password=pass;"
MS SQL Server "Provider=SQLOLEDB;data source=machinename;initial catalog=dbname;userid=sa;password=pass;"
MS text "Provider=microsof.jet.oledb.4.0;data source=your_path;Extended Properties'text;FMT=Delimited'"
分享到:
相关推荐
自动与sqlite3数据库做连接 数据的插入,查询,删除、更新操作 数据库建立与表建立 支持关于where语句查询的自动拼接。 支持text的模糊查询 windows 关于qt的数据库操作封装类 以及用例: SQLite,是一款轻型的...
基于C++实现多线程连接池MySQL源码+项目说明+详细代码注释.zip C++ 调用 MYSQL API 连接池 ## environment: * VS2022 * MySQL8.0.27 ## 高并发下频繁处理瓶颈 * 建立通信:`TCP三次握手` * 数据库服务器的`连接认证...
但是,所有的服务器都使用一种数据库格式,因此,你可以很方便的在不同的引擎之间共享数据库文件的数据。 协议: Firebird协议使用IPL(interbase public license)和IDPL(Initial Developer's Public License),这种...
享元模式运用共享技术有效地支持大量细粒度对象的复用。系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用。
该资料是《Visual C++ 2005入门经典》的源代码及课后练习答案 对应的书籍资料见: Visual C++ 2005入门经典 基本信息 原书名: Ivor Horton's Beginning Visual C++ 2005 原出版社: Wiley 作者: (美)Ivor Horton...
一个基于网络的VC++考试系统,压缩包内含服务器、用户端、Access数据库等源代码资料,共享之前经过了测试,截图如上,先运行服务端端程序,把数据库要拷入到Debug目录中,然后启动服务端,运行客户端并连接上服务器...
ado,dao,odbc数据库连接vc代码 演示了不同的数据库的各种操作(连接、删除、添加……等等) ATL开发指南源码 内部包含了atl控件的开发以及如何应用,演示了COM的包容与集合、自动化、事件和连接点、枚举器和集合...
5.4 在Visual C++中使用代码组件 5.4.1 利用OLE/COM Object Viewer查看组件信息 5.4.2 利用COM库函数使用代码组件——例程VCAuotCom 5.4.3 通过ClassWizard使用代码组件——例程VCAuotClw 5.4.4 利用#import指令...
8.3 在变量之间共享内存 8.3.1 定义联台 8.3.2 匿名联合 8.3.3 类和结构中的联合 8.4 运算符重载 8.4.1 实现重载的运算符 8.4.2 实现对运算符的完全支持 8.4.3 重载赋值运算符 8.4.4 重载加法运算符 8.4.5 重载递增...
8.3 在变量之间共享内存 8.3.1 定义联台 8.3.2 匿名联合 8.3.3 类和结构中的联合 8.4 运算符重载 8.4.1 实现重载的运算符 8.4.2 实现对运算符的完全支持 8.4.3 重载赋值运算符 8.4.4 重载加法运算符 8.4.5 重载递增...
ado,dao,odbc数据库连接vc代码 演示了不同的数据库的各种操作(连接、删除、添加……等等) ATL开发指南源码 内部包含了atl控件的开发以及如何应用,演示了COM的包容与集合、自动化、事件和连接点、枚举器和集合...
8.3 在变量之间共享内存 8.3.1 定义联台 8.3.2 匿名联合 8.3.3 类和结构中的联合 8.4 运算符重载 8.4.1 实现重载的运算符 8.4.2 实现对运算符的完全支持 8.4.3 重载赋值运算符 8.4.4 重载加法运算符 8.4.5 重载递增...
LimeReport v1.5.35LimeReport官方网站捐款特征多平台支持纯Qt4 / Qt5兼容代码嵌入式报表... 它将创建一个limereport共享库在您的项目中连接limereport库,然后在源代码中添加: # include " lrreportengine.h " to a
1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高...
C++提供了C连接交换指定符号extern“C”来解决名字匹配问题。 3、请简述以下两个for循环的优缺点(5分) for (i=0; i; i++) { if (condition) DoSomething(); else DoOtherthing(); } if (condition) { ...
8.3 在变量之间共享内存 8.3.1 定义联台 8.3.2 匿名联合 8.3.3 类和结构中的联合 8.4 运算符重载 8.4.1 实现重载的运算符 8.4.2 实现对运算符的完全支持 8.4.3 重载赋值运算符 8.4.4 重载加法运算符 8.4.5 重载递增...
8.3 在变量之间共享内存 8.3.1 定义联台 8.3.2 匿名联合 8.3.3 类和结构中的联合 8.4 运算符重载 8.4.1 实现重载的运算符 8.4.2 实现对运算符的完全支持 8.4.3 重载赋值运算符 8.4.4 重载加法运算符 8.4.5 重载递增...
8.3 在变量之间共享内存 8.3.1 定义联台 8.3.2 匿名联合 8.3.3 类和结构中的联合 8.4 运算符重载 8.4.1 实现重载的运算符 8.4.2 实现对运算符的完全支持 8.4.3 重载赋值运算符 8.4.4 重载加法运算符 8.4.5 重载递增...