📄 delphi数据库编程.htm
字号:
第三个按钮用于修改数据,当用户单击StringGrid的单元格时,单元格中的数据会显示于编辑框中,可以修改编辑框中的数据,然后单击这个按钮,将会修改这个单元格以及数据库中的数据。<br>
ADO中含有许多不同的对象,本文将集中讲述RecordSet和Fields这两个对象。<br>
可以用如下的代码生成一个RecordSet的实例:<br>
var<br>
RecordSet: OleVariant;<br>
begin<br>
RecordSet := CreateOleObject('ADODB.Recordset');<br>
... // Code omitted here<br>
end;<br>
CreateOleObject声明于ComObj.Pas中。它是ActiveX.Pas中的核心函数CoCreateInstance的一个简单包装。<br>
要打开数据库,可利用以下代码:<br>
const<br>
SELECTSTRING = 'SELECT * FROM Clients.dbf';<br>
DSNSTRING = 'DBDemosDBase';<p>
begin<br>
RecordSet := CreateOleObject('ADODB.Recordset');<br>
RecordSet.Open(SELECTSTRING, DSNSTRING);<br>
.. // Code omitted here<br>
end;<br>
Open方法有很多参数,但是在这个程序中我们只处理其中的两个。第一个是我们要执行的SQL语句,第二个是我们要操作的数据库。<br>
当打开一个数据集时,数据集游标位于第一个记录,可以用下面的代码访问这个记录:<p>
MyString := RecordSet.Fields[0].Value;<br>
MyString := RecordSet.Fields[1].Value;<p>
要移动游标,可以用RecordSet对象的Move方法:<br>
RecordSet.Move(1);<p>
<br>
利用Interface访问ADO:<p>
利用Interface访问ADO的步骤同从前的例子大致相同:<p>
procedure TForm1.InterfaceBtnClick(Sender: TObject);<br>
var RecordSet: _RecordSet;<br>
DSN: string;<br>
begin<br>
// Create an empty recordset object<br>
OleCheck(CoCreateInstance(CLASS_RecordSet, nil,<br>
CLSCTX_ALL, IID__RecordSet, RecordSet));<br>
DSN := 'dsn=' + DSNSTRING;<br>
// Fill the recordset<br>
RecordSet.Open(SelectString, DSN, adOpenForwardOnly,<br>
adLockReadOnly, adCmdUnspecified);<br>
// Display the data<br>
Display(RecordSet);<br>
UpdateBtn.Enabled := True;<br>
end;<p>
同前一节的代码不同,这些代码必须包含ADODB_TLB.PAS。<br>
这一段代码用ADODB_TLB.PAS中声明的_RecordSet代替了Variants。<br>
这里直接调用了CoCreateInstance来生成对象的实例。第一个参数传递了声明于ADODB_TLB.PAS中的常量CLASS_RecordSet,它代表RecordSet的Class ID,第四个参数为IID__RecordSet,也是声明于ADODB_TLB.PAS中的,注意,它带有两条下划线!最后一个参数是我希望建立的实例。<br>
当调用recordSet.Open的时候,应该穿第五个参数。<br>
const<br>
SELECTSTRING = 'SELECT * FROM Clients.dbf';<br>
DSNSTRING = 'DBDemosDBase';<p>
begin<br>
.. // Code omitted<br>
DSN := 'dsn=' + DSNSTRING;<br>
RecordSet.Open(SelectString, DSN, adOpenForwardOnly,<br>
adLockReadOnly, adCmdUnspecified);<br>
.. // Code omitted<br>
end;<br>
在前一节的例子中,可以只传递两个参数,这是因为Variants允许忽略参数,这时采用缺省值。当采用Interfaces时,则必须明确的定义参数。如果希望采用缺省值,则可以向下面这样调用函数:<br>
RecordSet.Open(SelectString, DSN, EmptyParam, EmptyParam, EmptyParam);<br>
在这里我们使用了EmptyParam这样一个Variant,它被声明于System.Pas,这些参数将采用缺省值。上面的例子中我用了声明于ADODB_TLB.PAS中的真正的缺省值。此类问题可参考Data Access SDK中的相关文件。<br>
打开数据集以后,就可以用同上一节相同的方法显示数据。唯一的不同就是RecordSet.Move方法要有两个参数。<br>
procedure TForm1.Display(RecordSet: _RecordSet);<br>
var Y, i: Integer;<br>
begin<br>
Y := 1;<br>
Repeat<br>
for i := 0 to 6 do<br>
StringGrid1.Cells[i, Y] := RecordSet.Fields[i].Value;<br>
RecordSet.Move(1, EmptyParam);<br>
Inc(Y);<br>
until RecordSet.EOF;<br>
end;<p>
修改数据<br>
当修改数据时,不能用打开数据集时使用的缺省值,而是应该传递以下的参数:<br>
const<br>
adOpenDynamic = $00000002;<br>
adLockOptimistic = $00000003;<br>
adCmdUnspecified = $FFFFFFFF;<br>
begin<br>
.. // Call CoCreateInstance<br>
DSN := 'dsn=' + DSNSTRING;<br>
RecordSet.Open(SELECTSTRING, DSN, adOpenDynamic, adLockOptimistic,<br>
adCmdUnspecified);<br>
.. // Code ommitted here<br>
end;<p>
无论你用的是Variants还是Interfaces,这段代码都将正常工作。<br>
当你的数据集以可读写的方式打开时,如adLockOptimistic方式,就可以修改数据库的内容了:<br>
RecordSet.Fields[0].Value := Edit1.Text;<br>
RecordSet.Update(EmptyParam, EmptyParam);<br>
这段代码可以修改当前记录的内容。当然也可以利用字段数组以及Move方法修改任何记录。如果用的是Variants方式,可以不传递任何参数。<br>
在例子中,我采用了一种简单的方法来编辑表中的字段。如果用户在某一个字段商单击,其数值会显示于编辑框中:<br>
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,<br>
ARow: Integer; var CanSelect: Boolean);<br>
begin<br>
Edit1.Text := StringGrid1.Cells[ACOl, ARow];<br>
end;<p>
用于更新数据的代码如下:<br>
RecordSet.Move(StringGrid1.Row - 1, EmptyParam);<br>
RecordSet.Fields[StringGrid1.Col].Value := Edit1.Text;<br>
RecordSet.Update(EmptyParam, EmptyParam);<p>
第一行将数据集游标移动到表格当前行,第二行修改数据,第三行提交修改。<br>
最后一步将把数据集游标移动到第一条记录,然后调用相同的过程显示修改后的数据库。<br>
RecordSet.MoveFirst;<br>
Display(RecordSet);<p>
<p>
<center><A HREF="#Content">[目录]</A></center>
<hr><br><A NAME="I1624" ID="I1624"></A><center><b><font size=+2>精简Delphi数据库应用系统-定制BDE驱动程序</font></b></center><br>
<p>
精简Delphi数据库应用系统-定制BDE驱动程序<br>
深圳<br>
王发军<br>
[请作者提供详细的邮政地址]<br>
---- Delphi程序员都知道,在数据库应用程序开发完成后,要发布程序需要同时发布BDE(Borland Database Engine),否则会引起错误“A Error occurred while attempingto initilize Borland Database Engine(Error $2109)”。当觉得程序太大而辛辛苦苦精简自己的程序到满意时,却发现BDE管理程序器需要9M之巨,不由感到沮丧,真有点自己的努力被糟蹋的感觉。不过也不必太沮丧,只要肯尝试,还是有办法来精简BDE的。<p>
---- 首先来看看BDE目录中的文件,所有文件确实有近9M大吧。不过有些可能是用不到的,关键文件的作用可参见Bde32.HLP中“Introduction to Borland Database Engine”下的“Core BDE Files”,其中列出了BDE的关键文件及其作用,可以以此作为依据来尝试精简BDE驱动程序。下面是各个文件的作用:<p>
---- 一、不可缺少的文件<p>
---- Blw32.dll:语言驱动函数库。<p>
---- Idapi32.dll:BDE基本函数库。<p>
---- Fareast.bll、Usa.bll:远东语言及美国语言驱动程序,对中文软件不可缺少。<p>
---- Idr20009.dll:错误信息库。<p>
---- 二、数据库驱动程序(根据需要选择一个或多个)<p>
---- Idasci32.dll:Ascii文本数据库驱动程序函数库,如果不用Ascii文本数据库,可以不要。<p>
---- Iddao32.dll:Access数据库驱动程序函数库,如果不用Access数据库,可以不要。<p>
---- Iddbas32.dll:dBase数据库驱动程序函数库,如果不用dBase数据库,可以不要。<p>
---- Idodbc32.dll:ODBC数据库驱动程序函数库,如果不用ODBC数据库,可以不要。<p>
---- Idpdx32.dll:Paradox数据库驱动程序函数库,如果不用Paradox数据库,可以不要。<p>
---- 三、其它驱动程序和配置文件(根据需要选择一个或多个)<p>
---- Idbat32.dll:批操作驱动程序函数库,如果不用TBatchMove控件或DbiBatchMove类函数,可以不要。<p>
---- Iddr32.dll:Data Repository驱动程序函数库,如果不用Data Repository功能,可以不要。<p>
---- Idprov32.dll:BDE DataSet provide驱动程序函数库,如果不用TProvider控件,可以不要。<p>
---- Idqbe32.dll:QBE驱动程序函数库,如果不用Query By Example,可以不要。<p>
---- Idsql32.dll:SQL查询驱动程序函数库,如果不用TQuery进行查询,可以不要。<p>
---- Idapi32.cfg:BDE配置文件,如果程序中没有特殊要求,可以不要。也可以在BDE管理器中设置正确后再分发。<p>
---- 四、其它文件(一般不用)<p>
---- BDE32.HLP、BDE32.CNT:BDE帮助文件,可以不要。<p>
---- BdeAdmin.exe、BdeAdmin.HLP、BdeAdmin.CNT:BDE管理器及帮助文件,如果不会发生要求软件用户自己配置BDE的情况时,可以不要。<p>
---- 其它*.BLL:其它国家和地区的语言驱动程序,可以不要。<p>
---- DataBump.EXE、DataBump.HLP、DataBump.CNT:数据库数据转移工具及帮助文件,可以不要。<p>
---- Localsql.HLP、Localsql.CNT:SQL查询语句帮助文件,可以不要。<p>
---- Sqllnk32.HLP、Sqllnk32.CNT:SQL连接帮助文件,可以不要。<p>
---- 在根据需要选择文件后,还要写注册表文件。这个应该不成问题,可以手工设置,但最好在程序中设置,在发现注册表中没有相应键值时写入,用TRegFile对象用不了几行代码的。需要设置的注册表键值有(在调用数据库操作前需要有正确的键值存在):<p>
---- 数据驱动程序所在目录的设置:<p>
---- HKEY_LOCAL_MACHINE\Software\Borland\Database Engine\DLLPATH(字符串值)<p>
---- 语言驱动程序所在目录的设置:<p>
---- HKEY_LOCAL_MACHINE\Software \Borland\BLW32\BLAPIPATH(字符串值)<p>
---- 语言驱动程序文件名:HKEY_LOCAL_MACHINE\ Software\Borland\BLW32\LOCALE_LIB#(字符串值)<p>
其中#为编号,按顺序为0、1、2、3......如:<br>
HKEY_LOCAL_MACHINE\Software\Borland\<br>
BLW32\LOCALE_LIB0="fareasst.bll"<br>
HKEY_LOCAL_MACHINE\Software\Borland<br>
\BLW32\LOCALE_LIB1="usa.bll"<br>
---- 就这些了,按此办法即可有效减少BDE驱动程序的大小,例如只用TTable控件操作Paradox数据库,则只要Idapi32.dll、Blw32.dll、Idr20009.dll、Fareast.bll、Usa.bll、Idpdx32.dll六个文件即可。<p>
---- 这些文件可放在任何一个目录,只要在注册表指明即可。OK,BDE由9M多减到不到2M,ZIP一下就700多K了,比原来的应用系统减少了不少吧。<p>
---- 以上程序在PWIN98+DELPHI3.0下调试通过.<br>
<center><A HREF="#Content">[目录]</A></center>
<hr><br><A NAME="I1625" ID="I1625"></A><center><b><font size=+2>利用Delphi开发网络数据库应用</font></b></center><br>
<p>
利用Delphi开发网络数据库应用<br>
北京航空航天大学<br>
林江<br>
---- Delphi 是具可视化界面的面向对象编程语言,它以其功能强大、简便易用等诸多特性,深受编程人员的欢迎。Delphi 中提供了数据库引擎 BDE(Borland Database Engine),并内含众多的数据库调用构件,为编程人员开发客户/服务器应用程序提供了方便。通常情况下,利用 Delphi 开发数据库应用程序,可以使用TTable、TDataSource、TDBEdit、TDBNavigator等构件。只要正确设置了构件的某些属性,再编写必要的程序代码对一些特定事件进行处理,就能够完成对多种数据库进行的数据处理,例如:记录的输入、修改、删除和查询等。这样做虽然只需要编写极少量的程序代码就能达到很好的效果,但如果在程序设计过程中,某些数据表的结构发生了改变,则必须修改与此数据表有关的所有构件的属性,这将使程序员陷入繁琐的重复劳动中。<p>
---- 为避免上述的麻烦,我们可以在编写网络数据库应用程序时采用结构化查询语言 SQL(Structured Query Language),这样不仅可以更方便地与诸如 SQL Server、Oracle 等各种后台数据库进行动态的数据交换,而且可以使程序的修改和移植更加灵活。我们以数据输入模块为例,说明开发客户/服务器应用程序时如何采用 SQL 语句实现数据处理功能。首先,判断是否已经有事务处理程序在运行,如果有,将其回卷(rollback);如果没有,则启动一个新的事务,为数据的最终处理做准备。其次,是设置 SQL 语句,并将其写入 TQuery 构件中。最后,将事务提交或回卷,至此完成一条记录的数据输入。<p>
---- 下面是以页面中的 TEdit 类型编辑框内容作为数据源,向数据库输入记录的过程代码:<p>
procedure DataInsert(const qName:TQuery;<br>
szDBName:string;iNum:Integer;<br>
iMark:array of Integer;eName:array of TEdit);<br>
var<br>
i : Integer;<br>
szSQL : string;<br>
begin<br>
if DataModule1.DataBase1.InTransaction=true then<br>
DataModule1.DataBase1.RollBack;<br>
DataModule1.DataBase1.StartTransaction;<br>
szSQL := 'INSERT INTO '+szDBName+' VALUES('<br>
for i:=0 to iNum-1 do<br>
begin<br>
if iMark[i]=0 then<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -