vb动态数据表格.docx
《vb动态数据表格.docx》由会员分享,可在线阅读,更多相关《vb动态数据表格.docx(9页珍藏版)》请在冰豆网上搜索。
![vb动态数据表格.docx](https://file1.bdocx.com/fileroot1/2022-12/8/d7cb3ce2-5381-4423-80c2-ed52f86c25b1/d7cb3ce2-5381-4423-80c2-ed52f86c25b11.gif)
vb动态数据表格
竭诚为您提供优质文档/双击可除
vb动态数据表格
篇一:
Vb6用ado对象动态建表
Vb6.0用ado对象动态创建数据库和表!
作者:
chengziii提交日期:
20xx-5-2719:
40:
00
摘要:
本文阐述了在Vb程序中利用ado对象动态创建数据库和数据表的方法,这些方法在开发Vb数据库应用程序中很有实用价值,它可以提高数据库程序灵活性。
关键词:
数据库、数据表、ado、adox
1:
问题的提出
在Visualbasic中,常用的数据访问接口有下列三种:
数据库访问对象(dao,dataaccessobject)、远程数据库对象(Rdo,Remotedataobject)和activex数据对象(ado,activexdataobject)。
数据库访问技术一直在不断进步,而这三种接口的每一种都分别代表了该技术的不同发展阶段。
最新的是ado,它是比Rdo和dao更加简单,然而更加灵活的对象模型。
正因如此,越来越多的人在用Vb开发数据库软件时使用ado作为数据访问接口。
在开发过程中,我们通常的使用的方法是:
先使用数据库管理系统(例如:
microsoftaccess)或Vb中的可视化数据管理器建立好数据库和数据表结构,然后在程序中通过使用adodc数据库控件或引用ado对象与数据库中的表建立连接,再通过数据库感知控件(例如:
文本框、datagrid等)来进行数据库的各种操作。
在这种开发过程中,我们有时需要面对这样一个问题:
如何让用户在程序运行过程中动态地建立自己所需的数据库和数据表以提高程序的灵活性呢?
在程序运行过程中建立自己所需的数据库和数据表,其本质就是用代码(或者说通过编程)来建立数据库和数据表。
众所周知,在Foxpro或asp编程中,这是很容易的一件事件。
那么在Vb数据库编程中又是怎样来操作的呢?
在Vb数据库编程中,如果使用dao作为数据库访问接口技术,则可以用createdatabase结合createtabledef方法来实现,目前已有不少书和杂志都讲到了这种方法,本文就不再讲述了;但你如果使用的是最新的数据库访问接口技术ado,你却发现目前的书和杂志上没有文章讲到如何用代码来建立数据库和数据表的方法,可有时我们非常需要用到这种方法,下面我们就来解决这个问题。
2:
ado与adox
我们先来对ado和adox进行简单的认识。
在Vb6中,使用ado开发数据库应用程序时,我们要引用对象库"microsoftactivexdataobjects2.5library",这个东西的简称就是ado,它是Vb6数据库最核心的对象群,也是Vb数据库开发人员经常所引用的对象库,在Vb6中你可以看到它的各种版本,从2.0版到2.6版都有,很多人对它已经很熟悉,在此我们不再详细介绍。
如果要在程序运行过程中创建数据库和表,我们还要引用对象库"microsoftadoext
2.1.Forddlsecurity",简称为adox,其库文件名为是:
msadox.dll。
adox是对ado对象和编程模型的扩展,它将ado扩展为包括创建、修改和删除模式|分类:
|访问量:
1127
对象,如表格和过程。
它还包括安全对象,用于维护用户和组,以及授予和撤消对象的权限。
adox的对象如下表所示:
对象说明
catalog包含描述数据源模式目录的集合。
column表示表、索引或关键字的列。
group表示在安全数据库内有访问权限的组帐号。
index表示数据库表中的索引。
key表示数据库表中的主关键字、外部关键字或唯一关键字。
procedure表示存储的过程。
table表示数据库表,包括列、索引和关键字。
user表示在安全数据库内具有访问权限的用户帐号。
View表示记录或虚拟表的过滤集。
adox常用方法有:
append(包括columns、groups、indexes、keys、procedures、tables、users、Views)、create(创建新的目录)、delete(删除集合中的对象)、“refresh”(更新集合中的对象)等等。
有关adox的详细信息,请在/data/ado中参阅microsoft发布的有关adox说明的web页。
3:
在原有数据表的基础上产生新的数据表
如果仅仅是在已有的数据表的基础上产生新的数据表,我们只要引用对象库"microsoftactivexdataobjects2.5library"再利用selectinto语句就可以了。
例如:
有一个名为wage.mdb的数据库,数据库中有一个名为"工资表"数据表,该数据表的字段有:
编号、姓名、基本工资、津贴、应发工资、扣款、实发工资等,这个表中已经有很多的记录。
现在我们把其中的实发工资大于2000的记录筛选出来组成一个新表,新表的名称由用户从文本框中输入,新表中我们只要三个字段,它们是:
编号、姓名、实发工资。
我们用下列程序就可以实现:
(事先在窗体中添加一个文本框text1和一个命令按钮command1)
dimconnasnewadodb.connection
dimrsasnewadodb.Recordset
mand
privatesubcommand1_click()
dimbmasstring
dimsqlasstring
iftext1.text""then
bm=trim(text1.text)
sql="select编号,姓名,实发工资into"+bm+"From工资表where实发工资>2000"
setcommand.activeconnection=conn
mandtext=sql
command.execute
else
msgbox"你必须输入一个名字"
endif
privatesubForm_load()
dimstrasstring
str=app.path
ifRight(str,1)"\"then
str=str+"\"
endif
pstr="provider=microsoft.jet.oledb.3.51;"
pstr=pstr"
pstr=pstr不用cat用另外一个名字也可以dimconnasnewadodb.connection
dimrsasnewadodb.Recordset
dimpstrasstring定义该变量是为了后面的书写方便
为了更灵活地创建数据库,我们可以在窗体中加入一个通用对话框、一个datagrid控件,三个命令按钮,它们的标题分别是:
创建数据库和表、查看、更新。
通用对话框的作用是给用户输入数据库文件名和决定数据库的存放位置。
"创建数据库和表"命令按钮对应的代码是:
privatesubcommand1_click()
dimfmasstringfm变量用来获取用户输入的文件名
commondialog1.Filter="mdb文件
(*.mdb)|*.mdb|allFiles(*.*)|*.*|"
commondialog1.Filterindex=1
commondialog1.initdir="d:
\jthpaper"
commondialog1.Flags=6
commondialog1.action=2
ifcommondialog1.Filename=""then
msgbox"你必须输入一个文件名,请重新保存一次!
"
exitsub
else
fm=commondialog1.Filename
endif
pstr="provider=microsoft.jet.oledb.4.0;"不能把这里的4.0改为
3.51
pstr=pstr创建数据库
dimtblasnewtable
cat.activeconnection=pstr
tbl.name="mytable"表的名称
tbl.columns.append"编号",adinteger表的第一个字段
tbl.columns.append"姓名",adVarwchar,8表的第二个字段tbl.columns.append"住址",adVarwchar,50表的第三个字段cat.tables.appendtbl建立数据表
conn.openpstr
rs.cursorlocation=aduseclient
rs.open"mytable",conn,adopenkeyset,adlockpessimisticrs.addnew往表中添加新记录
rs.Fields(0).Value=9801
rs.Fields
(1).Value="孙悟空"
rs.Fields
(2).Value="广州市花果山"
rs.update
endsub
上面程序中有一个需要说明的地方,这就是语句:
pstr=
"provider=microsoft.jet.oledb.4.0;",这个语句表示microsoftjetoledb驱动程序的版本是4.0,这是目前最新的版本,利用它你可以用Vb中的ado对象访问access2000及其以下版本所建立的数据库。
你不能把这里的"4.0"改为"3.51",否则程序不能正常运行;在Vb6中,3.51版本的microsoftjetoledb驱动程序对应的是access97数据库。
换而言之,用这种方法建立的数据库和表跟用access2000所建立的数据库和表是同一类型的,你只能直接用access2000来打开,虽然你可以用Vb6来访问这种数据库和其中的数据表,但你不能用access97或Vb6中的"可视化数据管理器"来直接打开。
在程序运行时只要用户单击该命令按钮就可以创建自己所需的数据库。
"查看"命令按钮对应的代码是:
privatesubcommand3_click()
setdatagrid1.datasource=rs
endsub
"更新"命令按钮对应的代码是:
privatesubcommand4_click()
rs.updatebatch
endsub
我们这个实例只是用来说明问题,在实际应用当中你可以把它进一步改进,例如:
你在窗体中再增加一些文本框和组合框,供用户输入或选择数据表的名称、字段的名称、字段的宽度和小数位数。
这样,用户就可以自主地决定数据库的所有内容了,程序的灵活性也就大大提高了。
5:
结束语
如果你使用的是最新的数据访问接口技术ado(microsoft强烈建议大家使用这种最新技术),你又想在程序运行过程中创建数据库文件和数据表,此时,你应该在Visualbasic6.0中引用对象库"microsoftactivexdataobjects
2.5library"和"microsoftadoext2.1.Forddlsecurity",然后使用adox对象的create、append等方法就可以实现。
这种方法使用的microsoftjetoledb驱动程序的版本是4.0,因此,使用这种方法建立的数据库文件和数据表可以直接使用access2000打开。
笔者在Vb数据库软件开发过程中已多次使用这种方法,该方法在提高程序的灵活性和满足用户的特殊需要方面有很大的作用。
篇二:
vb动态报表
Visualbasic中如何实现动态报表是一个在众多Vb网站论坛上提问频率很高的问题,在实际项目中,作者也遇到这个问题,经过一番深入研究,用一种简单的方法在Visualbasic中实现了动态报表。
Visualbasic中制作报表的工具有很多,如crystal报表编辑器、datareport报表窗体、printer对象以及象Vsview等一些第三方控件。
但crystal报表编辑器一般只能制作定制报表,printer对象操纵起来非常复杂,第三方控件多数需要购买,费用不非。
作者制作动态报表是通过datareport窗体实现的,以下通过一个具体的例子说明是如何实现动态报表的。
假设在c盘dongtai目录下存放一个access数据库stock.mdb,其中的"股票行情表"用来记录股票行情,"股票行情表"的数据结构如1表所示:
表1"股票行情表"数据结构
字段名称idstocknostocknamepriceswingmaxpriceminpricebargain
数据类型长整型文本文本双精度型双精度型双精度型双精度型长整型说明序号股票代号股票名称收盘价涨跌最高价最低价成交量
如果要设计这样的一个报表,报表输出字段由用户自己决定,用datareport窗体如何设计呢?
下面一步一步地说明。
1.熟悉datareport窗体和数据报表控件
datareport窗体是一个和普通窗体相似的窗体,最大的差别是该窗体上只能摆放数据报表控件,这种类型的控件只有六种,他们分别是:
Rptlabel,Rpttextbox,Rptimage,Rptshape,Rptline,RptFunction。
从名称上基本可以识别他们的用途,Rptlabel用来显示非数据绑定的文本的标签;通常用来制作报表的页标题;Rpttextbox显示数据绑定的文本的内容,即显示数据库的字段的内容;Rptimage显示一个图形,例如一个公司的商标;Rptshape能够画出许多图形,强调信息或增强视觉效果;Rptline能够在报表中画线,分割报表种不同的区域;RptFunction允许在报表标题或报表注脚区域摆放,它包含一个简单的数学统计函数。
datareport窗体和数据报表控件如图1所示
。
图1datareport窗体和数据
报表控件
为了能够输出所有字段,必须在datareport窗体不同的区域中摆放足够数量的相关报表数据控件,本例最多字段为八个,所以在"页标头"区域(section2)摆放了八个Rptlabel控件、九条竖分割线和上下两条横线,在"细节"区域(section1)摆放了八个Rpttextbox控件、九条竖分割线和下面一条横线,如图1所示。
同时为了以后的编码方便,对各控件采用如下的命名方式:
控件名称为控件类型+区域号+序号,例如,"页标头"区域(section2)八个Rptlabel控件分别命名为label21、label22、label23……label28,细节"区域(section1)的八个Rpttextbox控件分别命名为text11、text12、text13……text18,各区域的竖分割线采用同样的命名方式,但横分割线以控件类型+区域号来命名,如"页标头"区域中的上下两条横线分别命名为line2和line_2,在后面的代码里可以看出这种命名方式的好处。
datareport窗体中最重要的三种数据控件是Rpttextbox、Rptlabel和RptFunction,必须分别设置它们的属性,Rpttextbox最重要的属性是datafield,该属性指明了绑定记录的字段名称;Rptlabel最重要的属性是caption,该属性指明要显示的文本内容;RptFunction最重要的属性是datafield和functiontype,前者指明要绑定且作统计的记录的字段名称,后者指明统计函数的类型。
这三种控件有一共同属性是gangrow,该属性值为true时,当显示的内容超过控件的宽度时可以换行。
datareport窗体也有很多属性,如leftmargin、Rightmargin、topmargin、bottommargin、reportwidth、datasource等,其中reportwidth设置报表的纸面宽度(必须减去左右页边距的宽度),reportwidth须与打印机设置的纸面大小相对应,datasource设置datareport窗体的数据源。
需要说明的是datareport窗体中的各个区域都是对象,如section1.section2等,他们也有很多的属性,其中重点提出keeptogther属性,当keeptogether为true时,如果某条记录处在一页的最下面,但又不能够完全的打印出来时,可强制这条记录换到下一页输出,从而保证数据的完整性。
以上只是简单的说明了datareport窗体中涉及到的一些重要属性,其它未加说明的属性可在相关书籍和msdn中查阅。
2.主界面设计
作者设计的主界面如图2所示。
其中候选字段的listbox(lst_candidate)用来显示所有原始字段,选中字段的listbox(lst_selected)用来记录选中的以报表形式输出的字段,两个listbox之间的带有""标题的按钮用来添加和移去字段,用一个文本框(txt_caption)设置报表的标题,点击"输出报表"(cmd_report)按钮即可输出报表。
图2动态报表主界面
3.字段宽度的控制
字段宽度的控制在报表设计中很重要,这里是通过lst_selected的itemdata的属性实现的,仅用一个子程序可完成对lst_selected的itemdata的属性赋值,代码如下。
******************************************************************
字段宽度控制子程序
privatesubfieldwidth(lstaslistbox)
dimiasinteger
constwordwidthasinteger=201五号字的宽度为201缇
Fori=0tolst.listcount-1
selectcaselst.list(i)
case"序号"
lst.itemdata(i)=wordwidth*3
case"股票代号"
lst.itemdata(i)=wordwidth*5
case"股票名称"
lst.itemdata(i)=wordwidth*6
case"收盘价"
lst.itemdata(i)=wordwidth*5
case"涨跌"
lst.itemdata(i)=wordwidth*4
case"最高价"
lst.itemdata(i)=wordwidth*5
case"最低价"
lst.itemdata(i)=wordwidth*5
case"成交量"
lst.itemdata(i)=wordwidth*4
endselect
nexti
endsub
******************************************************************
4.设置datareport窗体属性,控制输出格式
设置datareport窗体的属性,控制输出格式也可用一子过程完成,需要说明的是为datareport和数据控件设置属性时,在设计编码过程中,Visualbasic多数不出现正常情况下的智能提示,不必大惊小怪,完整代码如下。
***********************************************************************设置报表窗体各种参数,控制输出格式
privatesubsetdatareport(lstaslistbox,dtrasdatareport,scaptionasstring)
dimleftposaslongleftpos为存放控件left属性的变量
dimreportwidthaslongreportwidth为存放datareport总宽度的变量
dimiasinteger
求总宽度
Fori=0tolst.listcount-1
reportwidth=reportwidth+lst.itemdata(i)
next
初始化
withdtr
设置数据源,页边距,标题,横向分割线,section1、2区第一条竖分割线
.leftmargin=1440
.Rightmargin=1440
.topmargin=1440
.bottommargin=144
.reportwidth=printer.width-2880-20
set.datasource=rsrs为adodb数据源
.sections("section4").controls.item("label41").caption=scaption
.sections("section4").controls.item("label41").width=reportwidth
.sections("section4").controls.item("label42").width=reportwidth
.sections("section2").controls.item("line_2").width=reportwidth
.sections("section2").controls.item("line2").width=reportwidth
.sections("section1").controls.item("line1").width=reportwidth
.sections("section2").controls.item("line20").left=0
.sections("section1").controls.item("line10").left=0
endwith
为section1,2区设置数据
leftpos=0
Fori=0tolst.listcount-1
dtr.sections("section2").controls.item("label1"特殊字段的格式特殊处理
iflst.list(i)="收盘价"orlst.list(i)="最低价"orlst.list(i)="最高价"then
dtr.sections("section1").controls.item("text1"对不用的text控件必须设置其datafield属性,如lst.list(0),否则出错,但一定让其不可见其他不用的label,line控件同样均不可见
i=lst.listcount
whilei 10为section1区域的非text控件的控件总数
i=i+1
dtr.sections("section1").controls.item("text1"******************************************************************************
5.报表输出