基于ADO技术动态创建SQL Server数据库

时间:2022-07-07 09:28:42

基于ADO技术动态创建SQL Server数据库

摘要:为了保存程序运行过程中产生的临时数据,比较好的做法是创建动态数据库,这既能灵活地处理各种类型格式的临时数据,又能节省存储空间。文章在Visual c++数据库应用程序中,利用ADO对象连接SQL Server数据源。然后通过调用ADO对象的函数来执行SQL语句,以动态地创建SQL Server数据库。

关键词:Vc++;ADO;动态创建;SQL Server数据库;SQL语句

0引言

在数据库应用程序运行过程中,有时会产生一些临时性的数据,它们可能是某个计算的中间结果,也可能是用于与其他系统进行交换的数据,或者是用于报表输出的数据等,这些数据虽然是临时产生并被使用的,但在使用完成之前也需要进行保存,而保存这些数据的方法不外乎两种:用文件来保存和用数据库来保存。若用文件来保存这些数据,则由于数据格式的原因会给数据的处理带来不便,因而用数据库来保存就成为一般常用的解决方法。

保存数据的数据库一般可以事先创建也可以动态创建。事先创建是指在程序运行之前创建好数据库,动态创建是指在程序运行过程中创建数据库。前者方法简便,但缺少了灵活性,因为事先创建的数据库的结构固定,这必然限制了临时数据的类型、格式和范围,而且事先创建的数据库在多数时间内有可能是闲置的,这也造成了存储空间的浪费。较好的解决方案是在产生临时性数据时,根据需要动态地创建数据库以保存临时数据,在处理完成之后删除动态创建的数据库。本文给出了一种动态创建数据库的方法。

1数据库动态创建技术

在vc++程序中动态创建数据库,需要通过数据库接口来实现。vc++为开发数据库应用程序提供了多种数据库访问接口,主要有:ODBC(开放数据库互连)、DAO(数据访问对象)、OLE DB(对象链接与嵌入数据库)和ADO(ActiveX数据对象)等。其中,DAO数据库接口主要用于Access数据库的访问,在微软的MFC类库中提供了相关的DAO类(cDaoDatabase类和CDaoTableDef类),通过定义这些类的对象并调用相应的成员函数就可以实现Access数据库和表的动态创建。对于ODBC和OLE DB访问接口,MFC中虽然也提供了相关的类,但没有提供用于创建数据库和表的成员函数。

ADO是微软极力推荐使用的最新的数据库访问技术,它已经成为目前数据库开发的主流。因此,针对ADO数据库访问技术,如何实现sQL Server数据库和表的动态创建,就成为编程人员较为关心的一项技术。

1.1 ADO对象

ADO对象模型包括以下几个对象:Connection对象、Error对象、Command对象、Parameter对象、Recordset对象和Field对象,其中Connection、Command和Recordset三个对象是主体对象,它们可以被独立创建和释放。

Connection对象用来建立和维护与数据源的连接,对数据源的任何操作都需要一个Connection对象。Command对象用来创建和执行对数据库的操作命令,可以使用该对象执行SQL语句或调用存储过程,Command对象执行后将返回一个Recordset对象。Recordset对象包含执行数据库操作后返回的―个记录集。通过该对象可以浏览和更新数据库中保存的记录。

一个基于ADO数据库访问技术的应用程序通常是使用Connection对象建立与数据源的连接,然后使用Command对象给出对数据库操作的命令,最后通过Recordset对象对结果记录集进行浏览、更新等操作。

在程序中要动态创建数据库,可以通过Connection对象来完成。首先通过该对象建立与数据源的连接,然后调用该对象的Execute函数来执行SQL语句实现数据库的创建。

1.2创建数据库和表的SQL语句

(1)创建数据库的SQL语句

CREATE DATABASE语句用来创建用户数据库。创建一个用户数据库的语法格式如下:

CREATE DATABASE database_name

ON(NAME=logical file name,FILENAME=‘os―file―name',

SIZE=size,MAXSIZE=max_size I UNLIMITED,

FLIEGROWTH=growth_increment)

LOG ON(NAME=logical file name,FILENAME=os―file―name',

SIZE=size,MAXSIZE=max_sizelUNLIMITED,

FLIEGROWTH=growth_increment)

以上语法格式中,大写的字符串是sQL关键字,小写形式的字符串是实际使用时由用户替换的参数。其中,参数database_name是要创建的数据库名,logical_file_name是逻辑文件名,os_file_name是操作系统下的文件名和路径,size是文件的初始容量,max_size是文件的最大容量,growth_increment是文件空间每次的增加量。在ON后面括号内的小写字符串是数据库文件的属性参数,在LOG ON后面的括号内的小写字符串是事务日志文件的属性参数。

(2)删除数据库SQL语句

DROP DATABASE语句用于删除数据库,该语句的语法格式如下:

DROP DATABASE database_name

其中,database_name是要删除的数据库名。

(3)创建表的SQL语句

CREATE TABLE语句用于创建―个表,其完整语法格式较为繁琐,在此也只说明本文实例程序中所用的语法格式。

CREATE TABLE database_name.owner.table_name

(column_namel data_type[NULLINOT NULL]

[PRIMARY KEY],

column_name2 data_type[NULLIOT NULL][PRIMARY KEY],

……

column_namen data_type[NULLINOT NULL][PRIMARY KEY])

其中,database_name是要在其中创建表的数据库名,owner是表所有者的用户ID,table_name是要创建的表名,column_namel―column_namen是表中的列名,data_type是列的数据类型。

(4)删除表的SQL语句

DROP TABLE语句用于删除表。该语句的语法格式如下:

DROP TABLE database_name.dbo.table_name

其中,database_name是要删除的表所在的数据库, table_name是要删除的表名。

2动态创建数据库的实现

2.1 ADO对象与数据源的连接

在MFC中,没有可与ADO一起使用的类,因此,若要在Visual c++程序中使用ADO对象,首先需要导入ADO动态链接库,在创建的VC工程的stdafx.h头文件中添加如下代码:

#import“C:\Program Files\Common Files\System\ado\

msadol 5.dll"\no__namespace rename(“EOF”,“adoEOF”)

以上代码的作用是告诉编译器将动态链接库文件msad015.dU引入到程序中,不使用ADO的命名空间,并且为了避免冲突,将符号常量EOF改名为adoEOF。

ADO是基于COM技术的,因此,在使用ADO对象之前必须初始化COM环境,在VC工程应用类的InitInstance成员函数中添加如下初始化COM环境的代码:

::ColnitiaUze(NULL);

在结束ADO对象的使用后,需要调用以下代码释放程序占用的COM资源。在VC工程应用类的ExitInstance成员函数中添加如下代码,将初始化的对象释放,清除为ADO对象准备的COM环境。

::CoUninitialize():

在导入的ADO库中包含3个基本接口:_ConnectionPtr接口、―commandPtr接口和_RecordsetPtr接口。其中,_ConnectionPtr接口用来创建一个数据源连接或执行一条不返回结果的sQL语句。因此,通过_ConnectionPtr接口执行创建数据库的SQL语句,就可以实现动态创建数据库。

使用ConnectionPtr接口连接数据源的步骤如下:

(1)声明一个Connection对象指针;

(2)调用Createlnstance函数创建一个Connection对象实例;

(3)调用open函数建立到数据源的连接。

其中,声明的Connection对象指针如果要被多个函数使用,则应将其声明为类的成员变量。笔者的实例程序是基于对话框的应用程序,因此,将Connection对象指针声明为主对话框类的成员。代码如下:

-ConnectionPtr m_pConn;

建立Connection对象到数据源连接的Open函数的原型为:HRESULT Open Lbstr_t ConnectionString,一bstr―t UserlD.

_bstr_t Password,long Options);

其中,参数的含义如下:

ConnectionString:包含连接信息的字符串;

UserlD:连接到数据源的用户ID;

Password:连接到数据源的密码;

Options:指明连接是同步进行还是异步进行,该参数可以是如下两个枚举常量:adConnectUnspecified(同步)和adAsyncConnect(异步)。

在这里,需要特别说明的是ConnectionStfing参数的格式。在实际应用中,根据所用数据库软件的不同,ConnecfionStdng参数的格式也有所不同。以下是笔者测试通过的连接sQLServer 2000数据源的示例代码:

m_pConn.Createlnstance(_uuidof(ConnectJon)):

m_pConn->Open('’Provider=SQLOLEDB.1:

Integrated Security=SSPI;Persist Security Info=False;

Data Source:Igtf",.1Ill。lllI adConnectUnspecified);

其中,代码中的lgff是SQL Server服务器名,读者在验证时需要根据自己的具体情况进行修改。以上代码可以添加到主对话框类的OnlnitDialog成员函数中。

从示例代码可以看出,ConnectionString参数的格式比较繁琐,初学者不容易理解和掌握。不过,微软为我们提供了一种可视化的解决方法,就是使用通用数据连接文件来建立和测试ADO的连接属性。数据连接文件的使用方法是:

(1)在VC工程文件夹中新建一个文本文件,然后将该文.件的扩展名改为udl;

(2)双击该文件打开“数据链接属性”对话框,在“提供程序”标签页中选择Microsoft OLE DB Provider for Server项,如图l所示。

(3)在“连接”标签页中,选择或输入SQL Server 2000服务器名称,如图2所示。

(4)单击“连接”标签页中的“测试连接”按钮,测试连接属性设置是否正确,若弹出的对话框中显示“测试连接成功”,则单击“确定”按钮完成数据连接文件的设置。

数据连接文件设置完成后,就可以将前面Open函数的调用代码改为:

m._pConn->Open(“File Name=mydata.udl”,””,””,

adConnectUnspecified);

使用数据连接文件的好处不仅仅是简化了连接属性的设置,还有利于数据库应用程序在用户机器上的安装和调试。当我们将开发好的数据库应用程序安装到用户机器上时,由于运行环境发生了改变,有时就需要重新修改程序代码进行连接调试。如果我们使用数据连接文件来设置连接属性,则在程序安装到用户机器上后,只需要重新设置一下数据连接文件,而不用修改程序就可以正常运行了。

在应用程序中,一般在使用完成数据库后,应该关闭与数据源的连接。ADO在关闭连接的同时,也将关闭所有使用这个连接的ADO对象。关闭连接的代码如下:

m_pConn->Close():

m_pConn=NULL;

以上代码可以添加到主对话框类的OnDestroy成员函数中。

2.2用SQL语句创建数据库和表

调用ADO对象模型中的Connection对象的Execute函数执行sQL语句,可以实现对数据源的相关操作。该函数的原型如下:

_RecordsetPtr Execute (_bstr_t CommandText,

VARIANTRecordsAffected,long Options);

其中,参数CommandText用于给出要执行的SQL语句,RecordsAffected是执行命令后的返回值,表明符合命令的行数,Options用于指定命令的类型。

如果要想创建数据库和表,则只要在调用Execute函数时,第1个参数给出创建数据库和表的sQL语句即可。示例代码如下:

_bstr_t strSQL("CREATE DATABASE student

ON(NAME=student,

FILENAME=\'C:\\Pmgmm Files\\Microsoft SQL

Server\\MSSQL\\data\\student_data.mdff)

LOG ON(NAME:student_log,

FILENAME=VC:\\Program Files\\Microsoft SQL

Server\\MSSQL\\data\\student_log.IdfV)”);

try{

m_pConn->Execute(strSQL,NULL,adCmdText);

catch Lcom_error&e){

MessageBox(e.ErrorMessage()):

以上示例代码是创建―个名为student的数据库。SQL语句中没有指定数据库文件和事务日志文件的初始容量,则默认为1MB;没有给出两个文件的最大容量,则默认为UNLIMITED。即增长到硬盘满为止;没有给出文件的增量,则默认为10%。

创建表的示例代码如下:

_bstr_t strSQL(“create table student.dbo.用户表(

用户名varchar(10)NO l NULL PRIMARY KEY.

密码varchar(16)NOT NULL,权限 integer)”):

try{

m_pConn->Execute(strSQL,NULL,adCmdText);

catch(_com_error&e){

MessageBox(e.ErrorMessage()):

以上代码是在student数据库中创建一个名为“用户表”的表,该表有3个列:“用户名”、“密码”和“权限”,其中“用户名”为主键,“用户名”和“密码”不能为空。

2.3用SQL语句删除数据库和表

删除数据库和表的SQL语句的语法相对较为简单,删除student数据库的示例代码如下:

bstr_t strSQL("DROP DATABASE student"};

try{

m_pConn->Execute(strSQL,NULL.adCmdText);

}

catch(_-com_error&e){

MessageBox(e.ErrorMessage()):

删除“用户表”的示例代码如下:

bstr_t strSQL(”DROP TABLE student.dbo.用户表”):

try{

m_pConn->Execute(strSQL.NULL。adCmdText);

}

catch L-com_error&e){

MessageBox(e.ErrorMessage()):

3结束语

本文探讨了利用ADO的Connection对象来连接数据源,然后通过调用Connection对象的Execute函数来执行sQL语句,实现SQL Sewer 2000数据库动态创建的方法。读者可以参照文中介绍的方法,或将所列的示例代码添加到自己的应用程序中,即可在自己的应用程序中实现数据库的动态创建。文中虽然针对的是Visual c++编程工具和sQL Sewer 2000数据库,但动态创建数据库和表的原理是一样的,读者只要理解了文中介绍的编程技术,也同样可以使用其他编程工具(如Visual Basic)来实现sQL Server 2000数据库或其他常见关系型数据库(如Oracle)的动态创建。动态创建的数据库的访问方法则与其他事先建立的数据库的访问方法相同。

(注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。)

上一篇:GL Studio在飞机虚拟座舱实现中的应用 下一篇:机房无人化管理的上机卡设计