📄 delphi数据库编程.htm
字号:
数据获取和处理(从任意的数据库中取出需要的数据,并进行处理)<br>
网络通讯(独立于位置的网络通讯)<br>
系统功能和实现。<br>
在该层次中,可以有不同的组件相互作用,协作完成任务。<p>
界面模型层:对应于可视组件<p>
按照习惯的界面模型,收集和制作与用户的操作习惯相一致的界面基本元素,如计划列表、资源查看列表等。<br>
<center><A HREF="#Content">[目录]</A></center>
<hr><br><A NAME="I1622" ID="I1622"></A><center><b><font size=+2>Delphi 3.0 中 连 接 数 据 库 的 三 种 方 式</font></b></center><br>
<p>
Delphi 3.0 中 连 接 数 据 库 的 三 种 方 式<br>
北 京 航 空 航 天 大 学 余 庆<br>
---- Delphi 3.0 对 访 问 数 据 库 提 供 了 强 有 力 的 支 持, 利 用Delphi 3.0 可 以 开 发 出 功 能<br>
强 大 的 数 据 库 应 用 程 序。<p>
---- Delphi 的 可 视 化 功 能 相 当 强 大, 制 作 一 个 简 单 的 仅 对 数 据 进 行 查 看 和 维 护<br>
的 程 序 十 分 容 易, 可 以 不 写 任 何 代 码 就 能 实 现 !Delphi 3.0 中 访 问 数 据 库 的 方<br>
式 有 三 种: 直 接 访 问, 如 访 问Paradox 和DBase 数 据 库; 通 过ODBC 访 问, 如 访 问<br>
Access、Foxpro 等 数 据 库; 通 过 内 嵌(Native) 方 式 访 问 数 据 库, 如 访 问SQL Server、<br>
Oracle、DB2 等。 在Delphi 中, 可 以 使 用Table 控 件 或/ 和Query 控 件 来 访 问 数 据 库, 二 者 的 设 置 和 用 法 都 差 不 多, 因 此 下 面 仅 以Table 控 件 为 例 说 明 这 三 种 方 式 的 特 点 和<br>
用 法。<p>
---- 1. 直 接 访 问<p>
---- Delphi 可 以 直 接 访 问Paradox 和DBase 这 两 个 桌 面 型 的 数 据 库 系 统。 访 问 这 两 种<br>
类 型 的 数 据 库 时 不 需 要 特 别 的 设 置, 只 需 要 把 文 件 路 径 赋 给Table 控 件 的 属<br>
性DatabaseName 就 可 以 访 问 该 路 径 下 的 数 据 库 了。 当 然, 也 可 以 事 先 建 立 映 射<br>
数 据 库 路 径 的 数 据 库 别 名, 然 后 把Table 控 件 的DatabaseName 属 性 设 置 为 相 应 的 数<br>
据 库 别 名。<p>
---- 2. 通 过ODBC 访 问<p>
---- 访 问Paradox 和DBase 以 外 的 数 据 库, 通 常 是 通 过ODBC 来 实 现 的。Delphi 可 以 访 问<br>
支 持ODBC 的 数 据 库 系 统, 如Access、SQL Server 和Oracle 等。 当 然, 通 过ODBC 访 问 数 据<br>
库 时, 首 先 要 使 用Windows 的 控 制 面 板 或Delphi 的 数 据 库 引 擎(BDE) 建 立ODBC 数 据<br>
源。<p>
---- Delphi 提 供 了Database 控 件, 该 控 件 的 作 用 有: 在 应 用 程 序 的 控 制 下 和 数 据 库<br>
系 统 建 立 连 接、 进 行 事 务 处 理 等。 在 数 据 库 应 用 程 序 中, 可 以 使 用Database 控<br>
件, 也 可 以 不 使 用。 如 果 不 使 用Database 控 件, 可 以 直 接 把ODBC 数 据 源 的 名 称<br>
赋 给Table 控 件 的 属 性DatabaseName 而 达 到 访 问 该 数 据 库 的 目 的。 这 种 方 式 的 弊 端<br>
是 在 程 序 运 行 时 由Delphi 系 统 自 动 弹 出 登 录 到 数 据 库 的 英 文 界 面 的 窗 口, 既<br>
不 美 观 又 不 便 于 控 制。 因 此, 笔 者 建 议 在 数 据 库 应 用 程 序 中 使 用Database 控 件<br>
来 登 录 到 数 据 库 系 统。 把Table 控 件 与Database 控 件 关 联 的 方 法 是 把 其DatabaseName<br>
属 性 值 指 定 为Database 控 件 的DatabaseName 属 性 值。 一 个Database 控 件 可 以 管 理 若 干 个<br>
Table 控 件。 和Database 控 件 建 立 关 联 以 后, 只 要 该Database 控 件 已 经 和 数 据 库 建 立<br>
了 连 接,Table 控 件 就 可 以 直 接 访 问 数 据 库 而 无 须 再 次 登 录。<p>
---- 3. 通 过 内 嵌 方 式 访 问<p>
---- Delphi 中 可 以 不 通 过ODBC, 而 以 内 嵌 方 式 访 问SQL Server、Oracle、DB2 等 数 据 库 系<br>
统。 这 需 要 使 用 数 据 库 别 名 来 指 定 数 据 库, 数 据 库 别 名 可 以 事 先 建 立, 也<br>
可 以 在 程 序 运 行 时 动 态 创 建。 前 者 称 为 静 态 别 名, 后 者 称 为 动 态 别 名。 使<br>
用 数 据 库 别 名 来 访 问 数 据 库 的 方 法 和 使 用ODBC 数 据 源 的 情 形 相 同, 这 里 不<br>
再 累 述。 通 过 内 嵌 方 式 访 问 数 据 库 的 静 态 别 名 必 须 在BDE 中 建 立。 以 访 问SQL<br>
Server 数 据 库 为 例, 在 建 立 别 名 时 必 须 指 定 数 据 库 服 务 器 的 名 称(SERVER<br>
NAME)、 主 机 名(HOST NAME) 以 及 要 访 问 的 数 据 库 名 称(DATABASE NAME), 可<br>
以 指 定 登 录 用 户 名(USER NAME) 和 口 令(PASSWORD) 等。 通 过 动 态 创 建 的 别 名<br>
来 访 问 数 据 库 必 须 使 用Database 控 件。 如 何 设 置Database 控 件 中 访 问 数 据 库 的 参<br>
数 呢 ? 用 鼠 标 双 击Database 控 件, 出 现 参 数 设 置 窗 口, 在"Driver name" 一 栏 选 择 要<br>
访 问 的 数 据 库 系 统, 如"MSSQL", 然 后 选 择 按 钮"Defaults", 就 会 把BDE 中 该 数 据 库<br>
系 统 所 需 的 参 数 名 称 和 缺 省 值 加 入 到"Parameter overrides" 列 表 中。 根 据 实 际 情 况<br>
更 改 参 数 中 的"SERVER NAME"、"DATABASE NAME" 等 项。 然 后 选 择 按 钮"OK" 就 可 以<br>
了。 需 要 说 明 的 两 点 是, 以 内 嵌 方 式 访 问 数 据 库 需 要 在 安 装Delphil 3.0 时 指 定<br>
安 装SQL Link;Query 控 件 的SQL 语 句 不 能 以 分 号 结 尾。<p>
---- 结 论<p>
---- 通 过 内 嵌 方 式 访 问 数 据 库 与 通 过ODBC 访 问 数 据 库 相 比, 前 者 的 速 度 要 快<br>
一 些。 而 且, 内 嵌 方 式 可 以 在 程 序 中 动 态 地 设 置 连 接 数 据 库 所 需 的 参 数,<br>
用 户 不 必 设 置ODBC 数 据 源, 这 就 降 低 了 对 用 户 技 术 水 平 的 要 求, 并 且 减 少<br>
了 用 户 的 工 作 量。 从 系 统 配 置 的 难 易 和 复 杂 程 度 来 看, 使 用 内 嵌 方 式 开 发<br>
出 的 数 据 库 应 用 系 统 更 便 于 普 通 用 户 使 用。 因 此, 笔 者 建 议 在 开 发 较 大 型<br>
的 应 用 系 统 时, 最 好 通 过 内 嵌 方 式 来 访 问 数 据 库。<br>
<center><A HREF="#Content">[目录]</A></center>
<hr><br><A NAME="I1623" ID="I1623"></A><center><b><font size=+2>Delphi下的ADO</font></b></center><br>
Delphi下的ADO<p>
本文向您揭示在Delphi中使用ADO是如何轻而易举,结合了ADO的Delphi应用程序,将不再依赖于BDE。<br>
ADO的精髓在于利用简单的COM指令来快速方便的访问ODBC数据源,微软的表格、列表框等ActiveX控件使得用户可以简便的利用ADO工作;然而,本文中笔者仅仅向您展示了如何利用程序访问数据库,将不采用任何可视化数据控件。<br>
本文将向您展示如何利用Variant或interfaces访问和修改ADO数据库,示例程序非常简单,可运行于Delphi 3或4。<br>
安装和访问一个ADO数据库。<br>
示例程序的代码不足150行,然而运行本程序必须首先安装ADO以及设置ODBC数据源。<br>
ADO是一组COM组件的集合,允许程序员利用利用少量的简单代码访问数据库。<br>
ADO通常和OLEDB、Universal Data Access以及Microsoft Data Access Components(MDAC)联系在一起。OLEDB产生较ADO为早,是后期各种技术的基础。<br>
如果你已经安装了ADO,你会在你的计算机中发现ADODB.DLL或者是MSADO15.DLL,这些文件中包含了一个类库,其中包括了利用ADO编程所需的全部接口和常量。在Delphi中,选择菜单Project | Import Type Library,选择以上的DLL文件,然后确定,系统生成了一个基于ADODB.DLL的ADODB_TLB.Pas文件,这个文件中包含了所有Delphi ADO编程所需的声明。<br>
最后一步的准备工作就是将Delphi演示数据库中的Clients.DBF设置为ODBC系统DSN,其别名为DBDemosDBase,驱动程序为Dbase 5。<br>
以下程序清单同时利用Variants和Interfaces访问ADO:<br>
unit Main;{---------------------------------------------------------------------<br>
Created Jan 5, 1999. Copyright (c) 1999 by Charlie Calvert<br>
----------------------------------------------------------------------}<br>
interface<p>
<br>
uses Windows, Messages, SysUtils, Classes, Graphics, Controls,<br>
Forms, Dialogs, StdCtrls, ComObj, Grids, ADODB_TLB, ExtCtrls;<p>
<br>
const<br>
SELECTSTRING = 'SELECT * FROM Clients.dbf';<br>
DSNSTRING = 'DBDemosDBase';<br>
type TForm1 = class(TForm)<br>
StringGrid1: TStringGrid;<br>
Panel1: TPanel;<br>
VariantBtn: TButton;<br>
InterfaceBtn: TButton;<br>
UpdateBtn: TButton;<br>
Edit1: TEdit;<br>
procedure VariantBtnClick(Sender: TObject);<br>
procedure InterfaceBtnClick(Sender: TObject);<br>
procedure UpdateBtnClick(Sender: TObject);<br>
procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;<br>
var CanSelect: Boolean);<p>
private<br>
procedure Display(RecordSet: _RecordSet); { Private declarations }<br>
public { Public declarations }<br>
end;<br>
var Form1: TForm1;implementation<br>
uses<br>
ActiveX;<br>
{$R *.DFM}<br>
procedure TForm1.Display(RecordSet: _RecordSet);<br>
var<br>
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;<br>
procedure TForm1.InterfaceBtnClick(Sender: TObject);<br>
var RecordSet: _RecordSet;<br>
DSN: string;<br>
begin<br>
// 生成空的recordset object<br>
OleCheck(CoCreateInstance(CLASS_RecordSet, nil,<br>
CLSCTX_ALL, IID__RecordSet, RecordSet));<br>
DSN := 'dsn=' + DSNSTRING;<br>
// 填写数据<br>
RecordSet.Open(SelectString, DSN, adOpenForwardOnly,<br>
adLockReadOnly, adCmdUnspecified);<br>
// 显示数据<br>
Display(RecordSet);<br>
UpdateBtn.Enabled := True;<br>
end;<br>
procedure TForm1.UpdateBtnClick(Sender: TObject);<br>
var RecordSet: _RecordSet;<br>
DSN: string;<br>
begin<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, adOpenDynamic,<br>
adLockOptimistic, adCmdUnspecified);<br>
// 修改<br>
RecordSet.Move(StringGrid1.Row - 1, EmptyParam);<br>
RecordSet.Fields[StringGrid1.Col].Value := Edit1.Text;<br>
RecordSet.Update(EmptyParam, EmptyParam);<br>
RecordSet.MoveFirst;<br>
Display(RecordSet);<br>
end;<br>
procedure TForm1.VariantBtnClick(Sender: TObject);<br>
var<br>
RecordSet: OleVariant;<br>
Y, i: Integer;<br>
begin<br>
// Create an empty recordset object<br>
RecordSet := CreateOleObject('ADODB.Recordset');<br>
// Fill the recordset<br>
RecordSet.Open(SELECTSTRING, DSNSTRING);<br>
// Display the data<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);<br>
Inc(Y);<br>
until RecordSet.EOF;<br>
end;<br>
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,<br>
ARow: Integer; var CanSelect: Boolean);<br>
begin<br>
Edit1.Text := StringGrid1.Cells[ACOl, ARow];<br>
end;<br>
end.<br>
这个程序有三个按钮,一个StringGrid以及一个编辑框,第一个按钮利用以Variants连接的ADO填充表格,第二个则利用Inteface进行连接。<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -