自动化是从一个应用程序内部自动控制另一个应用程序的方法 例如下面的代码 procedure CreateNewWord;varWordObj: Variant;beginWordObj := CreateOleObject( Word Basic ); {此函数声明于ComObj单元}WordObj AppShow;WordObj FileNew;end;这段代码将会打开WORD 并自动建立一个新的文档(当然前提是你的机子上安装了WORD) 这看来很有趣 也是一种非常有用的功能 那么如何让我们的程序也拥有类似WORD等的自动化功能并能让其它任何语言开发的程序对我们的程序进行自动化呢用DELPHI来实现非常简单
这篇文章将会以实例形式一步步的来说明如何开发一个简单的自动化服务器
新建一个普通的应用程序 将工程保存为AutoSrv bpr 在主窗体上放一个Edit控件 并保存为MainForm pas 在这里我们打算给这个程序加上对窗口标题 窗体颜色 和Edit控件文本的自动化控制(当然这实现的功能很少 但对于讲解如何开发自动化服务器程序足够了) 在主窗口中加入如下代码:(注意:请自行将这些函数和过程的声明加入TForm 的public区)function TForm GetCaption: string;beginresult := Self Caption;end;
procedure TForm SetCaption(ACaption: string);beginSelf Caption := ACaption;end;
procedure TForm SetColor(AColor: TColor);beginSelf Color := AColor;end;
procedure TForm SetEditText(AText: string);beginSelf Edit Text := AText;end;然后我们来给这个程序加上自动化的功能 点击New Items按钮 在d出的New Items窗口中点击ActiveX选项卡 选择Automation Object点击OK按钮 在d出的Automation Object Wizard窗口中CoClass Name一项中输入MyAutoSrv Delphi就会自动生成一个AutoSrv_TLB pas文件(类库)和实现类库接口类的单元 将这个新的单元保存为AutoSrvClass pas.
现在这个程序已经成为一个自动化服务器了 我们再来为其加上自动化的接口函数:( )点击View >Type Libray菜单 在Type Library Editor选择IMyAutoSrv接口 点击New Property 选择其属性为Read|Write 并把其命名为Caption Type设定为BSTR ( )点击New Method 将其命名为SetColor 点击右边的Parameters选项卡 点击ADD为新添的接口函数添加一个参数 将参数名设为AColor 参数Type设为OLE_COLOR ( )再次点击New Method 将其命名为SetEditText 以上面的方法为其添加一个参数 将参数名设为AText 参数Type设为BSTR
最后添加上接口函数的实现代码就OK了:在AutoSrvClass pas的Uses部分添加上MainForm 并将其代码改为如下代码 unit AutoSrvClass;
{$WARN SYMBOL_PLATFORM OFF}
interface
usesComObj ActiveX AutoSrv_TLB StdVcl MainForm;
typeTMyAutoSrv = class(TAutoObject IMyAutoSrv)protectedfunction Get_Caption: WideString; safecall;procedure Set_Caption(const Value: WideString); safecall;procedure SetColor(AColor: OLE_COLOR); safecall;procedure SetEditText(const AText: WideString); safecall;
end;
implementation
uses ComServ;
function TMyAutoSrv Get_Caption: WideString;beginResult := Form GetCaption;end;
procedure TMyAutoSrv Set_Caption(const Value: WideString);beginForm SetCaption(Value);end;
procedure TMyAutoSrv SetColor(AColor: OLE_COLOR);beginForm SetColor(AColor);end;
procedure TMyAutoSrv SetEditText(const AText: WideString);beginForm SetEditText(AText);end;
initializationTAutoObjectFactory Create(ComServer TMyAutoSrv Class_MyAutoSrv ciMultiInstance tmApartment);end 运行这个程序一次 将会自动注册为自动化服务器 可以在注册表中的HKEY_CLASSES_ROOT主键下面找到其相关的注册信息
上面演示了如何开发一个自动化服务器 在这里我们将调用它 新建一个程序 添加一个Button 在其VAR区声明一个Variant变量: AutoSrv: variant再在Button 中添加如下代码 procedure TForm Button Click(Sender: TObject);beginAutoSrv := CreateOleObject( AutoSrv MyAutoSrv ); {这个字符串就是自动化服务器的工程名加上CoClass Name}Self Caption := AutoSrv Caption;AutoSrv Caption := HEHE ;AutoSrv SetColor(CLRed);AutoSrv SetEditText( HAHA );end;其中的CreateOleObject函数将会返回一个IDispatch类型的接口 正是IDispatch接口让我们的程序可以对自动化服务器接口的调用进行后期连接 比如我们在上面添加一句AutoSrv Hello 程序也能被编释通过 但在执行时就会出错 使用Variant在执行效率上会比直接使用接口声明要慢一些 运行并点击按钮 可以看到自动化服务程序被加载 并按我们的代码设置了窗体色和EDIT 中的字串 呵呵 是不是很简单啊
lishixinzhi/Article/program/Delphi/201311/24993
严格的来说不算是个语言吧,算是一个工具。它里面用的是面向对象的pascal语言,是用来做系统的,像医院里的那些个收费系统啦,或者一些超市里面前台pos机用的
收银系统好多都是用delphi做的,不过现在已经不是社会的主流了,以前很流行的。
第二十章 开发Delphi对象式数据管理功能(五)
写DFM文件的过程 WriteComponentResFie
该过程带有两个参数FileName和Instance FileName参数指定要写入的DFM文件名 Instance参数是TComponent类型的 它指定要写入的部件名 一般是TForm对象的子类 该过程将Instance部件和其拥有的所有部件写入DFM文件
这个过程的意义在于 可以在程序运行过程中产生Delphi的窗体部件和在窗体中插入部件 并由该函数将窗体写入DFM文件 支持了动态DFM文件的重用性
该过程的程序是这样的
procedure WriteComponentResFile(const FileName: string; Instance: TComponent)
var
Stream: TStream;
begin
Stream := TFileStream Create(FileName fmCreate)
try
Stream WriteComponentRes(Instance ClassName Instance)
finally
Stream Free;
end;
end;
函数中 用FileStream创建文件 用Stream对象的WriteComponetRes方法将Instance写入流中
读DFM文件的函数 ReadComponentResFile
ReadComponentResFile函数带有两个参数FileName和Instance FileName参数指定要读DFM文件名 Instance参数指定从DFM文件中要读的部件 该函数从DFM文件中将Instance和它拥有的所有部件 并返回该部件
这个函数的意义在于 配合WriteComponentResFile过程的使用支持DFM文件的重用性
该函数的程序是这样的
function ReadComponentResFile(const FileName: string; Instance: TComponent)
TComponent;
var
Stream: TStream;
begin
Stream := TFileStream Create(FileName fmOpenRead)
try
Result := Stream ReadComponentRes(Instance)
finally
Stream Free;
end;
end;
程序中使用FileStream对象打开由FileName指定的DFM文件 然后用Stream对象的ReadComponentRes方法读出Instance 并将读的结果作为函数的返回值
读取Delphi应用程序资源中的部件
函数InternalReadComponentRes可以读取Delphi应用程序资源中的部件 Delphi 的DFM文件在程序经过编译链接后被嵌入应用程序的资源中 而且格式发生了改变 即少了资源文件头
在第一节中曾经介绍过TResourceStream对象 该对象是 *** 作资源媒介上的数据的 函数InternalReadComponentRes用了TResourceStream 程序是这样的
function InternalReadComponentRes(const ResName: string;
var Instance: TComponent) Boolean;
var
HRsrc: THandle;
begin { 避免 EResNotFound 异常事件的出现 }
HRsrc := FindResource(HInstance PChar(ResName) RT_RCDATA)
Result := HRsrc <> ;
if not Result then Exit;
FreeResource(HRsrc)
with TResourceStream Create(HInstance ResName RT_RCDATA) do
try
Instance := ReadComponent(Instance)
finally
Free;
end;
Result := True;
end;
HInstance是一个Delphi VCL定义的全局变量 代表当前应用程序的句柄 函数用了资源访问API函数FindResource来测定是否存在ResName所描述资源 因为在TResourceStream的创建过程还有FindResource等 *** 作 所以函数中调用了FreeResource 最后函数调用了Stream对象的ReadComponent方法读出部件 因为函数的Instance是var类型的参数 所以可以访问Instance 得到读出的部件
DFM文件与标准文本文件(TXT文件)的相互转换
在Delphi可视化设计环境中 允许程序员在代码编辑器中以文本的方式浏览和修改DFM文件内容 当用File/Open命令直接打开DFM文件或者选择窗体设计窗口的d出式菜单上的View as Text命令时 就会在编辑器中出现文本形式的信息 我们姑且将这种文本形式称之为窗体设计脚本 Delphi提供的这种脚本编辑功能是对Delphi可视化设计的一大补充 当然这个脚本编辑能力是有限制的 比方说不能在脚本任意地添加和删除部件 因为代码和DFM脚本是紧密相连的 任意添加和修改会导致不一致性 然而在动态生成的DFM文件中 就不存在这一限制 后面会介绍DFM动态生成技术的应用
实际上 DFM文件内容是二进制数据 它的脚本是经过Delphi开发环境自动转化的 而且Delphi VCL中的Classes库单元中提供了在二进制流中的文件DFM和它的脚本之相互转化的过程 它们是ObjectBinaryToText和ObjectTextBinary ObjectResourceToText和ObjectTextToResource
ObjectBinaryToText过程将二进制流中存储的部件转化为基于文本的表现形式 这样就可以用文本处理函数进行处理 还可以用文本编辑器进行查找和替代 *** 作 最后可以将文本再转化成二进制流中的部件
ObjectBinaryToText过程的主程序是这样的
procedure ObjectBinaryToText(Input Output: TStream)
var
NestingLevel: Integer;
SaveSeparator: Char;
Reader: TReader;
Writer: riter;
procedure WriteIndent;
const
Blanks: array[ ] of Char = ;
var
I: Integer;
begin
for I := to NestingLevel do Writer Write(Blanks SizeOf(Blanks))
end;
procedure WriteStr(const S: string)
begin
Writer Write(S[ ] Length(S))
end;
procedure NewLine;
begin
WriteStr(# # )
WriteIndent;
end;
procedure ConvertHeader;
begin
…
end;
procedure ConvertBinary;
begin
…
end;
procedure ConvertValue;
begin
…
end;
procedure ConvertProperty;
begin
…
end;
procedure ConvertObject;
begin
…
end;
begin
NestingLevel := ;
Reader := TReader Create(Input )
SaveSeparator := DecimalSeparator;
DecimalSeparator := ;
try
Writer := riter Create(Output )
try
Reader ReadSignature;
ConvertObject;
finally
Writer Free;
end;
finally
DecimalSeparator := SaveSeparator;
Reader Free;
end;
end;
过程中调用的ConvertObject过程是个递归过程 用于将DFM文件中的每一个部件转化为文本形式 因为由于部件的拥有关系 所以部件成嵌套结构 采用递归是最好的方式
procedure ConvertObject;
begin
ConvertHeader;
Inc(NestingLevel)
while not Reader EndOfList do ConvertProperty;
Reader ReadListEnd;
while not Reader EndOfList do ConvertObject;
Reader ReadListEnd;
Dec(NestingLevel)
WriteIndent;
WriteStr( end # # )
end;
NestStingLevel变量表示部件的嵌套层次 WriteIndent是写入每一行起始字符前的空格 ConvertHeader过程是处理部件的继承标志信息 转换成的头信息文本有两种形式
Inherited TestForm : TTestForm[ ]
或者
Object TestForm : TTestForm
前者是ffInherited和ffChildPos置位 后面是都没置位
ConvertProperty过程用于转化属性
procedure ConvertProperty;
begin
WriteIndent;
WriteStr(Reader ReadStr)
WriteStr( = )
ConvertValue;
WriteStr(# # )
end;
WriteIndent语句写入属性名前的空格 WriteStr(Reader ReadStr)语句写入属性名ConvertValue过程根据属性的类型将属性值转化为字符串 然后写入流中
lishixinzhi/Article/program/Delphi/201311/25088
Delphi的编程语言是以Pascal为基础的 Pascal语言具有可读性好 编写容易的特点 这使得它很适合作为基础的开发语言 同时 使用编译器创建的应用程序只生成单个可执行文件( EXE) 正是这种结合 使得Pascal成为Delphi这种先进开发环境的编程语言
本章中 我们将讨论Object Pascal的主要特点 并讲解如何在事件处理过程和其他应用程序中 使用它来编制程序代码 本章将讲解Delphi应用程序中最常用的Object Pascal语法 而不是Pascal语言的一切细节 如果您完全不熟悉Pascal编程 请参阅一些基础的Pascal教程 如果您具有编程经验 并能熟练地使用其他流行程序语言 您将在本章的Object Pascal中发现一些相同的概念 如果您已经熟悉了Borland Pascal 就可以快速浏览或跳过本章
编写Object Pascal程序代码
在本章中 我们将从熟悉Pascal编程的角度 配合实例 讲解Object Pascal编程的基本方法
在编写自己的Object Pascal程序时 要注意程序的可读性 Pascal语言是英式结构语言 在程序中选择合适的缩排 大小写风格 并在需要时将程序代码分行 会使得程序代码能够很容易地被自己和他人读懂 一般的程序员都有这样的体验 如果不给程序加上适当的注解 一段时间后 自己也难以理清程序的流程 给程序及时地加上注释是良好的编程习惯 Delphi的注释需要加注在{}之间 编辑器会把它们处理成为空白 Delphi保留了Borland Pascal编辑器的风格 关键字采用黑体字 被注释的部分会变暗 这使得编程风格良好 易读易写
编写赋值语句
在事件处理过程中 最常用到的工作就是把一个新值赋给一个属性或变量 在设计用户界面时 可以使用Object Inspector(Object Inspector)来改变其属性 但有时需要在程序执行时改变属性的值 而且有些属性只能在执行时改变 这些属性在Delphi的在线帮助的 Proprety 主题中被标为执行期属性 进行这种改变 就必须使用赋值语句
下文的赋值语句表征一个OnClick事件 当按钮按动后 将编辑框部件Edit 的Color属性置为clRed:procedure TForm Button Click(Sender: TObject);beginEdit Color := clRed;end;
当按动按钮后赋值语句被执行 编辑框变成红色
在语句中 部件的名称在属性前 中间用 表示属性的所属关系 这样就准确地指定了要将clRed值赋给哪一部件的哪一属性 赋值号为 := 不论给属性还是给变量赋值 都是将右边的值赋给左边的属性或变量
当将一个属性值 变量 常量或文本数据赋给属性或变量时 所赋值的类型和接受此值的属性或变量的类型应相同或兼容 一个属性或变量的类型定义了此属性或变量的可能值集合 也定义了程序代码可以执行的运算 在前边的例程中 编辑框部件的Color属性和clRed的类型都是TColor 可以在在线帮助中找到一个属性的类型 另外一种方法是在Object Inspector中选定该属性值段 并按下F 键 则类型将在属性说明的结尾处列出 例如Color属性列出下边的语句
Property Color : TColor;
有些属性是只读(Read Only)的 它们只能被读取 不能被改变 请查阅在线帮助 在Delphi中这些只读属性都有注解
标识符的说明与使用
标识符是Delphi应用程序中一些量的名称 这些量包括变量(var) 常量(const) 类型(type) 过程(procedure) 方法(Method)及其他 Object Pascal 在应用标识符时 必须首先说明它们 Object Pascal是强类型语言 它的编译器可以检查确保赋给变量或属性的值是正确的类型 以便于您改正错误 因为Object Pascal是编译语言 所以Delphi的执行速度要比使用解释语言快得多 在使用标识符前说明它们 可以减少程序错误并增加代码的效率
变量
变量是程序代码中代表一个内存地址的标识符 而此地址的内存内容在程序代码执行时可以被改变 在使用变量前必须对它进行说明 即对它进行命名 并说明它的类型 在所有变量说明以前加上保留字var 变量说明左边是变量的名称 右边则是该变量的类型 中间用(:)隔开
varValue Sum : Integer;Line : String;
在窗体中加入一个名称为Edit 的编辑框 再加入一个名称(属性Name)为Add的按钮部件 并建立如下的事件处理过程
procedure TForm addClick(Sender: TObject);varX Y: Integer;beginX := ;Y := ;Edit Text := IntToStr(X + Y);end;
在本例中 当按动ADD按钮时 编辑框中显示值 在Object Pascal中 必须确保变量或属性被赋予类型相同或兼容的值 您可以尝试将赋给X的值改为 或去掉IntToStr函数 在编译时会出现类型不匹配的错误 这也说明了Object Pascal强类型语言的特点 Object Pascal有多个预定义的数据类型 您可以说明任何这些类型的变量
整形 Integer的范围是 到 占 字节的内存 Shortint从 到 占 字节内存 Longint从 到 占 字节内存 Byte从 到 占 字节 Word从 到 占 字节内存 它们都是没有小数部分的数字
实型 Single可以包含 到 位有效小数部分 占用 字节的内存 Double类可以包含 到 位有效小数部分 占用 字节的内存 Extended类型包含 到 位有效小数部分 占用 字节内存 Comp可以包含 到 位有效小数部分 占用 字节内存 以上实数类型只有在 / 选项[N+]打开才可以使用 Real可以包含 到 位有效小数部分 占用 字节内存 它只有在和以前Borland Pascal兼容的情况下才使用 否则应使用Double或Extended
布尔型 Boolean 只包含true或False两个值 占用 字节内存
字符型 Char 一个ASCII字符 字符串类型String一串最长可达 个ASCII字符
指针型 Pointer 可以指向任何特定类型
字符串型 PChar 是一个指向以零结尾的字符串的指针
除了预定义类型外 Delphi还有自行定义的类型 上述例程的TColor就是这种类型 此外 用户还可以定义自己的数据类型 这部分内容将在下文中详细讲述
整型类别和实型类别都各有五种类型 同一类别中 所有的类型与其他同类别的都相容 您可以将一种类型的值赋给相同类别中不同类型的变量或属性 而只需要这个值的范围在被赋值的变量或属性的可能值范围内 例如 对于一个Shortint型的变量 可以接受在 到 范围内的任意整数 例如Shortint类型的 您不能将 赋给它 因为 已经超出了Shortint的范围了 将范围检查功能打开(选用Options|Project 并在Compiler Options Page中选择Range Checking) 将会检查出一个范围错误 如果Range Checking没有被打开 那么程序代码将可以执行 但被赋值的值将不是您期望的值
在一些情况下 您可以进行不同类型的变量或属性的赋值 一般来说 可以将一个较小范围的值赋给一个较大范围的值 例如 您可以将整型值 赋给一个接受实型值的Double属性而使得值成为 但如果将一个Double类型的值赋给整形变量 则会出现类型错误 如果您不清楚类型的兼容性 可以参阅Delphi的在线帮助中 Type Compatibility and Assignment Compatibility 主题
常量
常量在说明时就被赋予了一个值 在程序执行过程中是不可改变的 下面的例子说明了三个常量
constPi = ;Answer = ;ProductName = Delphi ;
象变量一样 常量也有类型 不同的是 常量假设其类型就是常量说明中其所代表的值的类型 上文的三个常量的类型分别是real型 整形 字符串型 常量用 = 表示两边的值是相等的
过程与函数
lishixinzhi/Article/program/Delphi/201311/8549
GetDatabaseNames方法
声明 procedure GetDatabaseNames(List: TStrings)
GetDatabaseNames方法清除List的内容并将所有BDE别名和应用程序定义的别名的名字写入List
GetDriverNames方法
声明 procedure GetDriverNames(List: TStrings)
GetDriverNames方法清除List中的内容 并将BDE当前安装的驱动程序名写入List
GetDriverParams方法
声明 procedure GetDriverParams(const DriverName: String; List: TStrings)
GetDriverParams方法消除List中的内容 并将名为DriveName驱动程序缺省参数写入List
GetTableNames方法
声明 procedure GetTableNames(const DatabaseName Pattern: Strings;
Extensions SystemTable: Boolean; List: TStrings)
GetTableNames方法消除List中的内容 并将名为DatabaseName的数据库中的所有表的名字写入List Pattern参数将限制表名 对于SQL服务器 将SystemeTables设为True将获取系统表和用户表 对非SQL数据库 将Extensions设为True将在表名中包含扩展名
处理Client/Server事务控制
使用隐式控制和显示控制的数据库应用中有两种方法管理事务控制
● 运用TDatabase部件的属性和方法进行显式控制
● 运用TQuery部件的传递式SQL控制事务
Delphi还支持Paradox和dBASE表的局部事务处理
事务控制概述
当用Delphi创建数据库应用时 Delphi提供了用为所有数据库访问的事务控制
事务是这样一组 *** 作 在被提交前 它们对一个或多个数据库的 *** 作 必须全部执行成功 如果其中一个 *** 作失败 则所有 *** 作失败 即事务具有原子性
即使发生硬件失败 事务也要保证数据库一致性 当允许多用户并发访问时 事务还要维持数据完整性
例如 一个应用程序可能更新ORDERS表以指明接受购买某一项目的定单 那么也要更新INNENTORY表以反映库存的减少 如果在第一个更新之后 第二个更新之前发生硬件错误 数据库就会处于不一致状态 因为库存情况没有反映定单情况 在事务控制下 两个表达式将在同一时间提交 如果其中一个表达式失败 则被返转(Rolled Back)
使用隐式控制
在缺省情况下 Delphi通过BDE为应用程序提供隐式事务控制 当应用程序处于隐式事务控制时Delphi为DataSet中的写每个记录进行隐式事务控制 它提交每一个独立的写 *** 作 如Post和Append Record
使用隐式事务控制是容易的 它保证最小的记录更新冲突和数据库的一致性视图 另一方面 因为写入数据库的数据的每一行都要进行事务控制 所以隐式事务控制将导致网络过忙和应用程序性能下降
如果采用显式事务控制 就能选择最有效的时机来开始 提交和终止事务 特别是在开发多用户环境下的客户应用程序运行访问远程SQL服务器 就更应该采用显式控制
使用显式事务控制
有两种协作又独立的方式可运用于Delphi数据库应用的事务控制
● 使用TDatabase部件的方法和属性
● 使用TQuery部件中的传递式SQL 这种方式只有在Delphi Client/Server Suite版中才有效 SQL Links将SQL表达式直接传给过程SQL或ODBC服务器
使用TDatabase部件的方法和属性的好处是提供了清晰的 轻便的 与特定数据库或服务器无关的应用能力
使用传递式SQL的主要好处在于可以运用特定服务器的先进事务管理能力
使用TDatabase的方法和属性
下表中列出了TDatabase部件中用于事务管理的方法和属性以及它们的使用方法
表 TDatabase用于事务显式控制的方法表
━━━━━━━━━━━━━━━━━━━━━━━━
方法或属性 作 用
────────────────────────
Commit 提交数据的修改并终止事务
Rollback 取消数据的修改并终止事务
StartTransaction 开始一个事务
TransIsolation 表述事务的独立性级别
━━━━━━━━━━━━━━━━━━━━━━━━
StartTransaction Commit和Rollback是供应用程序在运行时调用开始事务 控制事务并且保存或放弃所做数据修改的方法
TransIsolation是TDatabase部件的用于控制作用于相同表的不同事务之间如何交互的属性
⑴ 开始一个事务
当你开始一个事务时 后来的所有读写数据库的表达式都发生在那次事务的环境中 每个表达式都是其中一部分 任何表达式所做的修改 要么成功地提交给数据库 要么每一个修改都被取消 考虑一个在ATM上的银行传输问题 当顾客决定将钱从存款帐户转到支付帐户时 在银行数据库记录上必须发生两个修改
● 存款帐户必须记入借方
● 支付帐户必须记入贷方
如果出于某种原因 其中的一个 *** 作不能被完成 那么任何一个 *** 作都不应该发生 因为这些 *** 作是相关的 它们应该发生在同一个事务中
为了开始Delphi应用程序中的一个事务 需要调用TDatabase部件中的StartTransaction方法
DatabaseInterBase StartTransaction;
此后的所有数据 *** 作都发生在最近一个事务的环境中 直到该次事务通过调用Commit或Rollback显式地终止为止
那么 应当将事务保持多久呢?理想状态下 只要需要 多久都行 事务的活跃状态越长 同时访问数据库的用户越多 在你的事务的生命其中 更多的并发 同时的事务开始和终止 于是当试图提交修改时 与其它事务冲突的可能性更大
⑵ 提交一个事务
为了做永久性修改 事务必须使用TDatabase部件的Commit方法提交 执行提交表达式将保存数据库的修改并终止事务 例如 下列表达式将终止在上例中开始的事务
DatabaseInterBase Commit
Commit的调用应当置于try…except表达式中 如果一个事务不能成功提交 你就能处理错误 并重试 *** 作
⑶ 返转一个事务
为了取消数据库修改 必须用Rollback方法返转一个事务 Rollback 复原一个事务的修改 并终止事务 例如 下列表达式将返转一个事务
DatabaseInterBase Rollback;
Rollback通常发生在
● 异常处理代码
● 按钮或菜单事件代码 如用户点按了Cancel按钮
⑷ 使用TransIsolation属性
TransIsolation属性描述TDatabase部件事务的独立级别 事务的独立级别决定了事务与其它作用于相同表的事务是如何相互作用的 在改变或设置TransIsolation 的值之前 应当相当熟悉Delphi中的事务和事务管理
TransIsolation的缺省值是tiReadCommitted 下表中总结了TransIsolation的可能值并描述了它们的含义
表 TransIsolation属性值的含义
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
独立级别 含 义
──────────────────────────────────────
tiDirtyRead 允许读由其它同时事务写入数据库的未提交的修改 未提交的修改不是永久性的 可能在任何时候被复原 在这个级别你的事务与其它事务所做的修改具有最低独立度
tiReadCommitted 只允许读由其它同时事务提交的数据库修改 这是缺省的独立级别
iRepeatableRead 允许单个的数据库读事务无法看见其它同时事务对相同数据做的修改 这个独立级别保证了你的事务一次读一个记录 记录的视图不会改变 在这个级别你的事务与其它事务做的修改完全独立
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
各种数据库服务器不同程度地支持这些独立级别 有的根本不支持 如果请求的隔离级别不被服务器支持 Delphi将采用更高的独立级别 各种服务器支持的独立级别请参见表
如果应用程序使用ODBC与服务器交互 ODBC驱动程序必须支持独立级别
使用传递式SQL
为了能使用传递式SQL控制事物 必须
● 使用Delphi Client/Server Suite
● 安装正确的SQL Links驱动程序
● 正确配置网络协议
● 访问远程服务器上数据库的能力
● 用BDE配置工具将SQLPASSTHROUGH MODE设置为NOT SHARED
通过传递式SQL 你可以使用TQuery TStoredProc 或TUpdateSQL部件直接发送一个SQL事务控制表达式给远程数据库服务器 BDE本身并不处理SQL表达式 采用传递式SQL可使用户直接获得SQL服务器提供了事务控制优点 尤其是当那些控制是非标准的时
SQL PASS THROUGHMODE 描述BDE和传递式SQL是否共享相同的数据库联接 在大多数情况下 SQLPASSTHROUGHMODE被设置SHARED AUTOMIT 然而 如果你想将SQL事务控制传递给服务器 你就必须用BDE配置工具 将BDE的SQLPASSTHROUGHMODE 设置为NOT SHARED 此外 还必须为传递SQL事务控制表达式的TQuery部件建立独立的TDatabase 部件
使用本地事务
BDE还支持Paradox和dBASE上的本地事务 从代码角度而言 在本地事务和远程数据库服务器的事务之间没有什么差别
当作用于本地数据库表的事务开始时 更新 *** 作被记录在日志中 每个日志记录包含旧的记录缓冲区 当事务处于活跃状态 更新的记录被锁定 直到事务被提交或返转 在返转过程中 旧的记录被应用于将更新的记录恢复到原先的状态
使用存储过程
TStoredProc部件概述
存储过程是以数据库服务器为基础的接受输入参数 并将结果返回给应用程序的一段程序 TStoredProc部件 *** 作远程服务器上的数据库中的存储过程 存储过程是一连串表达式的集合 作为服务器的一部分存储 存储过程在服务器上执行一系列重复性的与数据库相关的任务 并将结果传给客户应用程序 如Delphi数据库应用程序
TStaredProc部件使Delphi数据库应用程序能执行服务器上的存储过程
通常 作用于数据库表中大量记录并且使用统计或数学函数的 *** 作都是存储过程的首选对象 通过将这些重复计算任务转移到服务器 可以提高数据库应用程序的性能
● 充分利用服务器的处理能力和速度
● 减少网络传输的数量
例如 考虑一个需要计算单个值的应用程序 在大批记录中的标准差值 如果在Delphi应用程序中执行这项功能就必须从服务器中得到所有在计算中用到的记录 这必将导致网络拥塞 因为应用程序所需的只是代表标准差的最终返回值 因此 由服务器上的存储过程来读数据 执行计算和将值传给应用程序将更有效
lishixinzhi/Article/program/Delphi/201311/25131
以上就是关于用DELPHI开发自动化服务器全部的内容,包括:用DELPHI开发自动化服务器、delphi是做什么用的数据库开发工具编程语言(delphi数据库开发案例精选)、DELPHI基础教程:开发Delphi对象式数据管理功能(五)[1]等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)