摘要 论述Delphi及Visual Basic编程中与数据库相关的若干技巧。
关键词 SQL语言数据库报表
曾分别用Delphi4.0和Visual Basic 6.0编写了小型数据库管理系统,现将积累的一些编程经验介绍如下和大家一起分享。 1 在Delphi中利用SQL语句来实现复合查询 这里提供使用SQL语句完成复合查询的技巧。比如,要实现课表的查询,其条件有六种分别是:班级、星期、节次、教师、课程、教室。要实现两个条件以上的复合查询必须用'and'将多个条件连接起来。通常用按钮触发一个事件,给SQL语句加上'and'。这样操作比较敏琐,特别是在条件比较多的情况下。如果SQL语句中没有'or'连接,可以通过以下方法简化操作。 procedure TA1form.BitBtn2Click(Sender:TOb-ject); begin query1.close;ry query1.sql.Clear;
query1.sql.add('selectfrom"c:\ wubiao\ebiao3"where 2>1'); if classs.text<>''then query1.sql.add('and class='+classs.text);
if week .text<>''then query1.sql.add ('and week='+week.text); if time.Text<>''then query1.sql.add('andtimer='+time.text);
if teacher.text<>''then query1.sql.add('andteach='+teacher.text);
if lesson.text<>''then query1.sql.add('andlesson='+lesson.text); ifclassroom.text<>'then query1.sql.add
('and classroom='+classroom.text); query1.sql.add(';'); query1.open; except showmessage('无效的查询'); end; class.text;='';week.text:=''; time.text:=''; teacher.text;='';lesson.text:=''; classroom:=''; end; 2 在Delphi中利用quickreport组件来 实现动态报表的打印 在delphi中,可利用quickreport组件快速完成静态报表的打印任务,但要对某一查询结果进行打印输出,即要实现动态报表的打印,则没有现成组件来直接利用,为此,我们在编程过程中再三思考,终得一妙法。比如:要对教师考勤表的统计结果进行打印,若直接用datasource和table组件来和quick-report组件连接,只能打印出原始表中的所有记录,而无法满足用户对某些特定信息的需要。为此可根据现有的教师考勤表重建一个结构相同的副表,将副表的datasource和table组件连接起来,设计好报表样式。然后把搜索到的记录集添加到副表中进行打印。打印结束后,再删除副表中的记录。 3 在Delphi中给记录中添加照片 首先,在数据表中设置bolb字段,当然在dabase visualdabase等数据表中无法直接加入照片,可通过dataa accse中的dbimage组件和dialog中的openpicturedialog组件来加入bmp格式的图片。最后还应加入data-source和table组件以便和数据表连接。代码
Procedure TC2form.Button1Click(Sender:TOb-ject);
begin i fnotopenpicturedialog2.Executethen exit;
table1 .open;
table1.edit; dbimage2.picture.loadfromfile(openpicturedialog2.filename);
table1.edit;
table1.post;
4 在VB中检查数据表以及字段存在性的方法
当用程序代码试图向数据库中添加表时,仅因为此库中已经存在同名的数据表而出错,所以在执行建表代码前应确定表在库中的存在性。当然添加字段也同样。例如:要在"c:工资.mdb"中建一张"工资表",在打开库后,加如下代码: ①Dimtbl As TableDef Dimdbs As Database For EachtblIn dbs.TableDefs Iftbl.Name="工资表"Then dbs.Execute("droptable[表]") Exit For End If N exttbl‘直接在程序中应用检查表的存在性。
或者应用函数: ②Public Function ynmytable(mytdnameAs String,mydbname As Database)As Boolean For Each mytd In mydbname.TableDefs If UCase(mytd.Name)=UCase(mytdname)Then ynmytable=True E xitFunction End If
Next ynmytable=False End Function‘确定表的存在性函数,函数值为真则存在。
使用①或②后,建表就不会因为表的存在而出错,添加字段也同样类似。 5 在VB中把一张图片以长二进制数存入 ACCESS数据库 下面代码主要功能是当用户单击Im-age1图片框时,应用程序弹出打开文件对话框,用户选择合适图片打开,即可存到打开的数据库中。 Image1_Click() Data1.databasename=App.Path+"档案.mdb" Data1.RecordSource="档案表" Data1.Refresh Image1.Datafiled="照片" Image1.datasource=Data1 Private SubImage1_Click() If Image1.Picture<>LoadPicture()Then IfvbCancel=MsgBox("照片以存在,要替换吗?",vbOKCancel+vbQuestion,"提示")
Then ExitSub CommonDialog1.Filter="picture(*.bmp) |*.bmp|*.jpg|*.jpg" CommonDialog1.Action=1 If CommonDialog1.FileName<>""Then Image1.Picture=LoadPicture(CommonDialog1.FileName) SavePicture Image1.Picture,CommonDia-log1.FileName Else ExitSub End If Endsub
6 在VB中用报表设计器实现动态数据库报表打印 在VB中用数据报表设计器对确定的数据库表做好报表后,再想打印同种表(字段完全相同),还需要重新设计,而这项工作不可能让用户来完成,解决的办法是:在先建一张字段完全相同的空表,然后做好报表,以后想打印不同内容,只要把内容转拷贝到此表中即可。拷贝的方法为:
Data1.DatabaseName="c:/wq.mdb"'欲打印报表的数据库表 Data1.RecordSource="www" Data1.Refresh Data2.DatabaseName="c:/wq.mdb"'做报表的数据库表 Data2.RecordSource="qqq" Data2.Refresh I Data2.Recordset.RecordCount<>0 Then Data2.Recordset.MoveLast Data2.Recordset.MoveFirst For j=0 To Data2.Recordset.RecordCount-1 Step 1 D ata2.Recordset.Delete Data2.Recordset.MoveNext Nextn EndIf Data1.Recordset.MoveLast Data1.Recordset.MoveFirst Fori=0 To Data1.Recordset.RecordCount-1 Step 1 Data2.Recordset.AddNew Forj=0 To Data1.Recordset.Fields.Count-1 Step 1 Data2.Recordset.Fields(j).Value=Data1.Recordset.Fields(j).Value Nextj Data2.Recordset.Update Data1.Recordset.Move Next
Next i
|