#i nclude <iostream.h> #import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename ("EOF", "adoEOF") //ADO连接数据库所需的dll,编译的时候系统会为我们生成msado15.tlh,ado15.tli两个C++头文件来定义ADO库 //注意这里的import一定要放在一行
int main(){
//该程序使用ADO连接ACCESS(装office的时候里面有)数据库 后缀为.mdb 运行平台vc6.0 //2003平台在写着 //--------------------------------------------------------------------------------- //ADO数据库连接分五步走, //第一、获取连接(只到数据库在什么地方) //第二、打开连接 open(必要的用户名和密码) //第三、获取字符集 ResultSet(类似数组的数据存储对象), //第四、显示数据 //第五、关闭数据集、关闭连接 //创建个连接对象 _ConnectionPtr m_pConnection;
//对连接进行初始化 CoInitialize(NULL);
//--------------------------------------------------------------------------------- //第一步、获取连接 //--------------------------------------------------------------------------------- //同过连接(Connection)创建并获取一个数据库连接实例, //也可以把他看成句柄(电影门票)有里他就有资格使用数据库里的资源了 呵呵 m_pConnection.CreateInstance(__uuidof(Connection));
// 又于在数据库连接的时候有有可能会出现错误,比如数据源设置或用户名 密码错误等 //所以使用try{....}catch(){...}捕获try{}里的异常(错误) //并把这些异常放到_com_error e 这个变量里,我们可以同过他获取错误的信息 //并且,在出错的时候程序一定回运行catch(){....}里的东西,我们看到如果连接错误的时候 //会执行cout<<"数据库连接失败,确认数据库mydb.mdb是否在当前路径下!"<<endl; // return FALSE; 之后推出程序 。如果不加try的话可以在程序出错的时候造成死机 //所以,try也可以看成一种出错的处理(异常处理) try { //--------------------------------------------------------------------------------- //第二步、打开连接 参数用 ; 分开 //--------------------------------------------------------------------------------- //第一个是Provider=Microsoft.Jet.OLEDB.4.0; access的厂商 //Data Source=mydb.mdb","","",adModeUnknown 数据库名称 , 用户名(空) ,密码(空), 缺省连接模式 //对于该参数:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (1) /*adModeUnknown:缺省。当前的许可权未设置 adModeRead:只读 adModeWrite:只写 adModeReadWrite:可以读写 adModeShareDenyRead:阻止其它Connection对象以读权限打开连接 adModeShareDenyWrite:阻止其它Connection对象以写权限打开连接 adModeShareExclusive:阻止其它Connection对象打开连接 adModeShareDenyNone:允许其它程序或对象以任何权限建立连接 */ //通过这个语句我们的数据库连接真正得到实现了,m_pConnection有了内容了(被附值了) m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=mydb.mdb","","",adModeUnknown); } catch(_com_error e) //捕捉异常 { cout<<"数据库连接失败,确认数据库mydb.mdb是否在当前路径下!"<<endl; return FALSE; }
//数据集对象 _RecordsetPtr m_pRecordset; //实例化数据集 m_pRecordset.CreateInstance(__uuidof(Recordset));
//--------------------------------------------------------------------------------- //第三步、获取数据集 //--------------------------------------------------------------------------------- //虽然,前面连接上了,但连接的这个数据库里是不是有数据表(test表)还不能确定 //所以,这里同样要捕获可能出现的错误 try { m_pRecordset->Open("SELECT * FROM test", //是数据查询字符串(即所谓的SQL语句) //通常这些语句分为 数据的查询(select),插入(insert) //更新(update),删除(delect) //是否能执行这个命令是由前面(1)确定的 m_pConnection.GetInterfacePtr(), // 获取库接库的IDispatch指针 adOpenDynamic, //动态光标。所有数据库的操作都会立即在各用户记录集上反应出来 adLockOptimistic, //乐观锁定方式。只有在你调用Update方法时才锁定记录。在此之 //前仍然可以做数据的更新、插入、删除等动作 adCmdText); //查询出来的数据是显示在控制台里的 } catch(_com_error *e) { cout<<e->ErrorMessage()<<endl; }
_variant_t var; char *ID,*name; try//得到表,但表里不一定有数据 { if(!m_pRecordset->BOF) //数据表里是是有数据 m_pRecordset->MoveFirst(); //将游标(数据集在数据库的叫法)移动到一第一条记录 else { cout<<"表内数据为空"<<endl; return 1; }
//-------------------------------------------------------------------------------------------------------------------------- // 第四步、显示数据 //---------------------------------------------------------------------------------------------------------------------------
while(!m_pRecordset->adoEOF) //和前面的rename ("EOF", "adoEOF") 想对应 这里使用的是 //adoEOF代替EOF (当然这里如果前面没有rename也可以使用EOF) //判断游标是不是到达最后一条数据 { var = m_pRecordset->GetCollect("ID"); //这是获取表中字段的一种方法“ID”为表字段名 if(var.vt != VT_NULL) //判断记录在该有没数据 ID= _com_util::ConvertBSTRToString((_bstr_t)var); //由于得到的数据可能不是字符传 这里要转换 //将他们转成字符串,从而可以在屏幕上显示 var = m_pRecordset->GetCollect("name"); if(var.vt != VT_NULL) name=_com_util::ConvertBSTRToString((_bstr_t)var);
cout<<ID<<" is "<<name<<endl; //打印该记录 m_pRecordset->MoveNext(); //游标向走向下条记录 } } catch(_com_error *e) //捕获异常 { cout<<e->ErrorMessage()<<endl; //如有错误 ,将错误输出 } //-------------------------------------------------------------------------------------- //关闭数据集 //----------------------------------------------------------------------------------- m_pRecordset->Close(); m_pRecordset = NULL; //-------------------------------------------------------------------------------------- //关闭数据库连接 //-------------------------------------------------------------------------------------- if(m_pConnection->State) m_pConnection->Close(); m_pConnection= NULL;
//这两步是一定要做的,否则时间长内存可能会被用尽 return 0; }
|