VC++使用ADO开发ACCESS数据库本文通过实例演示如何在VC++中使用ADO进行ACCESS数据库编程,并对涉及到的几个概念进行详细解释。本文不对ADO和ACCESS的基本概念进行详细解释,主要包括以下内容:第一部分ADO和ADOX到底是什么,二者的作用和区别建立数据库第二部分ADOX创建ACCESS数据库第三部分ADO创建ACCESS数据库的表第四部分使用_ConnectionPtr接口开发ACCESS数据库第五部分使用_RecordsetPtr接口开发ACCESS数据库第一部分ADO和ADOX到底是什么,二者的作用和区别ADO是Microsoft最新推出的数据库访问的高层软件接口。它和Microsoft以前的数据库访问接口DAO、RDO相比具有更大的灵活性,使用也更方便,开发效率大为提高。ADOX是核心ADO对象的扩展库。它提供的附加对象可用于创建、修改和删除模式对象,如表和过程。要使用ADOX,则应建立对ADOX类型库的引用。ADOX库文件名为Msadox.dll。通俗地讲,ADO是访问数据库的一种接口,可以使用它方便地进行数据库编程。而ADOX是微软对ADO功能的扩展,比如:可以ADOX创建数据库(而ADO没有创建数据库的功能)。第二部分ADOX创建ACCESS数据库用ADOX创建access数据库方法很简单,只需要创建一个Catalog对象,然后调用它的Create方法就可以了。例程ADOXCreateDatabase演示如何使用ADOX创建一个ACCESS数据库。打开VC++6.0,新建一个基于对话框的工程ADOXCreateDatabase。在对话框IDD_ADOXCREATEDATABASE_DIALOG中添加一个编辑框IDC_DBNAME和一个按钮IDC_BTN_CREATE,编辑框用以输入数据库名称。使用ClassWizard给编辑框创建一个CString变量m_dbName。双击IDC_BTN_CREATE按钮,并编辑OnBtnCreate()函数如下:voidCADOXCreateDatabaseDlg::OnBtnCreate(){//使输入到编辑框IDC_DBNAME的内容更新到m_dbName变量中UpdateData(TRUE);CStringstr;str=d:\\+m_dbName+.mdb;//检查该数据库是否已经存在,如果该数据库已经存在,弹出消息框,返回//使用API函数PathFileExists()检查路径文件是否存在//请注意:为了使用API函数PathFileExists(),需要加入//#includeShlwapi.h//#pragmacomment(lib,shlwapi.lib)if(PathFileExists(str)){CStringstrTemp;strTemp.Format(%s已存在!,str);AfxMessageBox(strTemp);return;}//定义ADOX对象指针并初始化为NULL//用ADOX创建access数据库方法很简单,//只需要新建一个Catalog对象,然后调用它的Create方法就可以了。//Catalog是ADOX的一个对象,它包含描述数据源模式目录的集合。//在这里,您只需知道创建数据库时使用这个对象就可以了。//注意用try...catch组合捕捉错误_CatalogPtrm_pCatalog=NULL;CStringDBName=Provider=Microsoft.JET.OLEDB.4.0;Datasource=;DBName=DBName+str;try{m_pCatalog.CreateInstance(__uuidof(Catalog));m_pCatalog-Create(_bstr_t((LPCTSTR)DBName));}catch(_com_error&e){AfxMessageBox(e.ErrorMessage());return;}}使用ADOX,需要引入ADOX的动态链接库msadox.dll,即在stdafx.h中加入如下语句:#importC:\ProgramFiles\CommonFiles\system\ado\msadox.dllno_namespacerename(EOF,adoEOF)另外,ADOX属于COM对象,所以要在CADOXCreateDatabaseApp::InitInstance()函数中加入:if(!AfxOleInit()){AfxMessageBox(OLE初始化出错!);returnFALSE;}初始化COM。好了,编译并运行该例程,对于编译过程中弹出的4146号警告不要理会。在编辑框中输入一个数据库名称,点击“创建数据库”按钮,该数据库将在d盘根目录下创建,再次输入该数据库名称并点击“创建数据库”按钮,将弹出警告对话框。在vc中使用ADO的时候会得到4146号警告信息,我们可以不去理会,也可以通过#pragmawarning指令解决,方法为:将在stdafx.h中加入的语句:#importC:\ProgramFiles\CommonFiles\system\ado\msadox.dllno_namespacerename(EOF,adoEOF)前后再加一条语句,修改后为:#pragmawarning(disable:4146)#importC:\ProgramFiles\CommonFiles\system\ado\msadox.dllno_namespacerename(EOF,adoEOF)#pragmawarning(default:4146)指令#pragmawarning(disable:4146)暂时屏蔽编译时4146警告信息指令#pragmawarning(default:4146)重置编译器的4146警告到默认状态第三部分ADO创建ACCESS数据库的表我们一般用ADOX创建数据库,然后再用ADO创建数据库的表。例程CREATE_DB_AND_TABLE演示如何使用ADO创建ACCESS数据库的表。打开VC++6.0,新建一个基于对话框的工程CREATE_DB_AND_TABLE。在对话框IDD_CREATE_DB_AND_TABLE_DIALOG中添加如下控件:控件名称ID用途编辑框IDC_DBNAME输入数据库名称按钮IDC_BTN_CREATE创建数据库编辑框IDC_TABLENAME输入表名按钮IDC_BTN_CREATE_TABLE创建表使用ClassWizard给两个编辑框创建CString变量:编辑框CString变量编辑框IDC_DBNAMEm_dbName编辑框IDC_TABLENAMEm_tableName双击IDC_BTN_CREATE按钮,并编辑OnBtnCreate()函数如下:voidCADOXCreateDatabaseDlg::OnBtnCreate(){UpdateData(TRUE);CStringstr;str=d:\\+m_dbName+.mdb;if(PathFileExists(str)){CStringstrTemp;strTemp.Format(%s已存在!,str);AfxMessageBox(strTemp);return;}_CatalogPtrm_pCatalog=NULL;CStringDBName=Provider=Microsoft.JET.OLEDB.4.0;Datasource=;DBName=DBName+str;try{m_pCatalog.CreateInstance(__uuidof(Catalog));m_pCatalog-Create(_bstr_t((LPCTSTR)DBName));}catch(_com_error&e){AfxMessageBox(e.ErrorMessage());return;}}以上代码例程ADOXCreateDatabase中已经详细叙述。双击IDC_BTN_CREATE_TABLE按钮,并编辑OnBtnCreateTable()函数如下:voidCCREATE_DB_AND_TABLEDlg::OnBtnCreateTable(){//先判断表名编辑框是否为空UpdateData(TRUE);if(!m_tableName.IsEmpty()){ADOX::_CatalogPtrm_pCatalog=NULL;ADOX::_TablePtrm_pTable=NULL;CStringstr;str=d:\\+m_dbName+.mdb;CStringDBName=Provider=Microsoft.JET.OLEDB.4.0;Datasource=;DBName=DBName+str;//这段代码先检查表是否已经存在,如果表已经存在,不再创建,直接返回。//其实这段代码不必深入研究,只需知道它的功能,直接拿来使用即可try{m_pCatalog.CreateInstance(__uuidof(ADOX::Catalog));m_pCatalog-PutActiveConnection(_bstr_t(DBName));inttableCount=m_pCatalog-Tables-Count;inti=0;while(itableCount){m_pTable=(ADOX::_TablePtr)m_pCatalog-Tables-GetItem((long)i);CStringtableName=(BSTR)m_pTable-Name;if(tableName==m_tableName){AfxMessageBox(该表已经存在!);return;}i++;}}catch(_com_error&e){AfxMessageBox(e.Description());return;}ADODB::_ConnectionPtrm_pConnection;//创建表_variant_tRecordsAffected;try{m_pConnection.CreateInstance(__uuidof(ADODB::Connection));//Open方法的原型://Open(_bstr_tConnectionString,_bstr_tUserID,_bstr_tPassword,longOptions)//ConnectionString为连接字串,UserID是用户名,Password是登陆密码//Options是连接选项,可以是如下几个常量://adModeUnknown缺省,当前的许可权未设置//adModeRead只读//adModeWrite只写//adModeReadWrite可以读写//adModeShareDenyRead阻止其它Connection对象以读权限打开连接//adModeShareDenyWrite阻止其它Connection对象以写权限打开连接//adModeShareExclusive阻止其它Connection对象打开连接//adModeShareDenyNone阻止其它程序或对象以任何权限建立连接m_pConnection-Open(_bstr_t(DBName),,,ADODB::adModeUnknown);}catch(_com_errore){CStringerrormessage;errormessage.Format(连接数据库失败!\r错误信息:%s,e.ErrorMessage());AfxMessageBox(errormessage);return;}try{CStringstrCommand;/*执行SQL命令:CREATETABLE创建表格该表包含三个字段:记录编号INTEGER,姓名TEXT,出生年月DATETIMESQL语言中的createtable语句被用来建立新的数据库表格。createtable语句的使用格式如下:creat