VC++使用ADO开发ACCESS数据库.docx
- 文档编号:27883207
- 上传时间:2023-07-06
- 格式:DOCX
- 页数:50
- 大小:35.11KB
VC++使用ADO开发ACCESS数据库.docx
《VC++使用ADO开发ACCESS数据库.docx》由会员分享,可在线阅读,更多相关《VC++使用ADO开发ACCESS数据库.docx(50页珍藏版)》请在冰豆网上搜索。
VC++使用ADO开发ACCESS数据库
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(),需要加入
//#include"Shlwapi.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中加入如下语句:
#import"C:
\ProgramFiles\CommonFiles\system\ado\msadox.dll"no_namespacerename("EOF","adoEOF")
另外,ADOX属于COM对象,所以要在CADOXCreateDatabaseApp:
:
InitInstance()函数中加入:
if(!
AfxOleInit())
{
AfxMessageBox("OLE初始化出错!
");
returnFALSE;
}
初始化COM。
好了,编译并运行该例程,对于编译过程中弹出的4146号警告不要理会。
在编辑框中输入一个数据库名称,点击“创建数据库”按钮,该数据库将在d盘根目录下创建,再次输入该数据库名称并点击“创建数据库”按钮,将弹出警告对话框。
在vc中使用ADO的时候会得到4146号警告信息,我们可以不去理会,也可以通过#pragmawarning指令解决,方法为:
将在stdafx.h中加入的语句:
#import"C:
\ProgramFiles\CommonFiles\system\ado\msadox.dll"no_namespacerename("EOF","adoEOF")
前后再加一条语句,修改后为:
#pragmawarning(disable:
4146)
#import"C:
\ProgramFiles\CommonFiles\system\ado\msadox.dll"no_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_DBNAME
m_dbName
编辑框IDC_TABLENAME
m_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(i { 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,出生年月DATETIME SQL语言中的createtable语句被用来建立新的数据库表格。 createtable语句的使用格式如下: createtablename(column1datatype,column2datatype,column3datatype); 如果用户希望在建立新表格时规定列的限制条件,可以使用可选的条件选项 createtabletablename (column1datatype[constraint], column2datatype[constraint], column3datatype[constraint]); 举例: createtableemployee (firstnamevarchar(15), lastnamevarchar(20), agenumber(3), addressvarchar(30), cityvarchar(20)); 简单来说,创建新表格时,在关键词createtable后面加入所要建立的表格的名称, 然后在括号内顺次设定各列的名称,数据类型,以及可选的限定条件等。 使用SQL语句创建的数据库表格和表格中列的名称必须以字母开头, 后面可以使用字母,数字或下划线,名称的长度不能超过30个字符, 注意,用户在选择表格名称时不要使用SQL语言中的保留关键字, 如select,create,insert等,作为表格或列的名称 */ strCommand.Format("CREATETABLE%s(记录编号INTEGER,姓名TEXT,出生年月DATETIME)",m_tableName); //Execute(_bstr_tCommandText,VARIANT*RecordsAffected,longOptions) //其中CommandText是命令字串,通常是SQL命令, //参数RecordsAffected是操作完成后所影响的行数 //参数Options表示CommandText中内容的类型,可以取下列值之一: //adCmdText表明CommandText是文本命令 //adCmdTable表明CommandText是一个表名 //adCmdProc表明CommandText是一个存储过程 //adCmdUnknown未知 m_pConnection->Execute(_bstr_t(strCommand),&RecordsAffected,ADODB: : adCmdText); if(m_pConnection->State) m_pConnection->Close(); } catch(_com_error&e) { AfxMessageBox(e.Description()); } } } 这段代码先用ADOX的Catalog对象检查表是否已经存在,如果该表已经存在,直接返回;如果还没有该表,使用ADO的Connection对象的Execute函数创建表。 Connection对象的用法: 首先定义一个Connection类型的指针,然后调用CreateInstance()来创建一个连接对象的实例,再调用Open函数建立与数据源的连接。 最后使用Execute()函数执行SQL语句创建表。 关于调用CreateInstance()来创建连接对象的实例,还需作一点说明。 ADO库包含三个基本接口: _ConnectionPtr接口,_RecordsetPtr接口和_CommandPtr接口。 其分别对应Connection对象(完成应用程序对数据源的访问连接),Recordset对象(将查询的结果以记录集的方式存储)和Command对象(对已连接的数据源进行命令操作)。 _ConnectionPtrm_pConnection; _RecordsetPtrm_pRecordset; _CommandPtrm_pCommand; 而这三个对象实例的创建,可以使用如下语句: m_pConnection.CreateInstance(__uuidof(Connection)); 或者: m_pConnection.CreateInstance(“ADODB.Connection”); m_pRecordset.CreateInstance(__uuidof(Recordset)); 或者: m_pRecordset.CreateInstance(“ADODB.Recordset”); m_pCommand.CreateInstance(__uuidof(Command)); 或者: m_pCommand.CreateInstance(“ADODB.Command”); 两种方法的作用完全相同,使用哪种方法,完全是您的个人爱好问题。 如例程ADOXCreateDatabase,在BOOLCCREATE_DB_AND_TABLEApp: : InitInstance()函数中加入: if(! AfxOleInit()) { AfxMessageBox("OLE初始化出错! "); returnFALSE; } 在stdafx.h中加入如下语句: #import"C: \ProgramFiles\CommonFiles\system\ado\msadox.dll" #import"C: \ProgramFiles\CommonFiles\system\ado\msado15.dll"rename("EOF","adoEOF") 关于这两条语句,需要进行特别说明: 由于该例程同时使用ADOX和ADO,需要同时引入msado15.dll和msadox.dll两个库。 这两个库的名字空间是不同的,msado15.dll的名字空间是ADODB,msadox.dll的名字空间是ADOX。 在使用ADO所属的名字空间的变量,函数时,在前面加上ADODB: : ,在使用ADOX所属的名字空间的变量,函数时,在前面加上ADOX: : 。 另外,一般ADOX和ADO分开操作。 您也可以在ADOX操作部分使用usingnamespaceADOX: : ,而在ADO操作部分使用usingnamespaceADO: ,以区分名字空间。 这样,您就不必再使用ADOX: : 和ADODB: : 了。 rename(“EOF”,”adoEOF”)//重命名EOF是必要的,因为典型的VC应用都已经定义了EOF作为常数-1,为了避免冲突,将ADO中的EOF重命名为adoEOF。 #import中有一个属性为no_namespace,这是告诉编译器该类不在一个单独的名字空间中,使用no_namespace意味着你不需要在初始化变量的时候引用名字空间。 当然如果在您的应用中需要导入多个类型库的话,不要使用no_namespace,以免引起名字冲突。 再通俗一点讲,就是只导入一个类型库的话,可以在#import语句中加入no_namespace属性,您的程序可以直接使用这个类型库的名字空间的内容,而不必使用usingnamespaceXXX;或XXX: : ,这是因为no_namespace属性告诉编译器该类型库不再名字空间,而是在全局空间上工作;如果您导入几个类型库,而这几个类型库之间没有定义冲突,您也可以在使用no_namespace属性;但如果两个类型库中有定义冲突,就不能使用no_namespace属性,如果使用no_namespace属性,就会在全局空间产生定义冲突。 对于本例程,您可以把stdafx.h中的 #import"C: \ProgramFiles\CommonFiles\system\ado\msadox.dll" #import"C: \ProgramFiles\CommonFiles\system\ado\msado15.dll"rename("EOF","adoEOF") 改为 #import"C: \ProgramFiles\CommonFiles\system\ado\msadox.dll" #import"C: \ProgramFiles\CommonFiles\system\ado\msado15.dll"no_namespacerename("EOF","adoEOF") 这样改动后,voidCCREATE_DB_AND_TABLEDlg: : OnBtnCreateTable()中的ADODB: : 需要完全省略掉。 当然,您也可以把这两行改为: #import"C: \ProgramFiles\CommonFiles\system\ado\msadox.dll"no_namespace #import"C: \ProgramFiles\CommonFiles\system\ado\msado15.dll"rename("EOF","adoEOF") 但这样改动后,voidCCREATE_DB_AND_TABLEDlg: : OnBtnCreateTable()中的ADOX: : 需要完全省略掉。 由于ADOX和ADO有定义冲突,也就是说,msado15.dll和msadox.dll有相同的定义部分,所以在一个程序中,不允许同时使用no_namespace。 第四部分使用_ConnectionPtr接口开发ACCESS数据库 ADO中最重要的对象有三个: Connection、Recordset和Command,分别表示连接对象、记录集对象和命令对象。 三个对象对应的智能指针分别是: _Con
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC 使用 ADO 开发 ACCESS 数据库