Delphi实现简单处理数据库
Delphiadmin 发布于:2017-11-17 16:38:20
阅读:loading
Delphi在CAO作数据库方面,当时找了一些资料有看到使用ADO和ODAC,进一步分析了发现网上使用ADO的示例较多,但它要在使用者的机器上安装oracle客户端,就为这我果断放弃它;而ODAC插件则不需要oracle客户端,但是它是需要安装在Delphi平台基础上的插件,并且网上关于它的示例不是一般的少,基本上找一大堆找不到一个靠谱的资源,当然不排除我看不懂的情况。反正现状就是在一堆其它语言示例的基础上和自己琢磨出来的,现在想想觉得还真是费劲。但是有个重要的事情要提醒,ODAC组件是只能够连接oracle数据库,无法对其他种类数据库进行*作的,如果你将要使用其他数据库,本篇文章显得不太合适了。
一般对于数据库方面的*作,不说好的实现吧,起码要遇到的问题有:
(1)sql执行中文乱码;
(2)动态参数执行,防止sql拼接引起的注入;
(3)事物控制;
(4)sql的查询返回列表的循环处理方式;
(5)sql的insert、update、delete返回的影响记录行数处理方式;
(6)。。。。。。
然而这些基本的CAO作,本篇文章的示例都已经实现了,详细参考如下:
unit ODACTest;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DB, MemDS, DBAccess, Ora;
type
TodacForm = class(TForm)
dataSource: TOraSession;
statement: TOraQuery;
queryButton: TButton;
transButton: TButton;
procedure FormCreate(Sender: TObject);
procedure queryButtonClick(Sender: TObject);
procedure transButtonClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
odacForm: TodacForm;
implementation
{$R *.dfm}
//窗体初始化
procedure TodacForm.FormCreate(Sender: TObject);
begin
//设置连接数据库参数
dataSource.Username := '你的数据库用户名';
dataSource.Password := '你的数据库用户密码';
dataSource.Server := 'xxx.xxx.xxx.xxx/TEST';
//也可以通过图形化界面的属性面板进行设置
end;
procedure TodacForm.queryButtonClick(Sender: TObject);
var
dataCount : Integer;
i : Integer;
name : String;
sex : String;
begin
dataSource.Open;
statement.SQL.Add(
'select * from ( ' +
'select ''貂蝉'' name , ''女'' sex from dual ' +
'union ' +
'select ''吕布'' name , ''女'' sex from dual ' +
'union ' +
'select ''孙策'' name , ''男'' sex from dual ' +
'union ' +
'select ''大乔'' name , ''女'' sex from dual ' +
') newTab where name = :v_name '
);
statement.Params.ParamByName('v_name').AsString := '吕布';//填充参数值
statement.ExecSQL;//执行sql语句
dataCount := statement.RecordCount;
for i := 1 to dataCount do
begin
name := statement.Fields.FieldByName('name').AsString;
sex := statement.Fields.FieldByName('sex').AsString;
showmessage('第[' + inttostr(i) + ']条:name=' + name + ',sex=' + sex);
end;
statement.SQL.Clear;
statement.Close;
dataSource.Close;
end;
procedure TodacForm.transButtonClick(Sender: TObject);
var
dataResult : Integer;
begin
dataSource.Open;
dataSource.AutoCommit := false;
statement.SQL.Clear;
//第一次执行一条新增语句,如果出错了仍然入库
statement.SQL.Text := 'insert into 你的表 values(''cdd11'' , ''陈DD'' , ''11'')';
statement.ExecSQL;//执行sql语句
dataSource.Savepoint('还原点1');//事物回滚到此处后
//第二次执行一条新增语句,如果出错了回滚数据
statement.SQL.Text := 'insert into 你的表 values(''cdd22'' , ''陈DD'' , ''22'')';
statement.ExecSQL;//执行sql语句
try
dataResult := strtoint('abc');//出现异常
dataSource.Commit;
except
begin
showmessage('出现类型转换异常,事物回滚');
dataSource.RollbackToSavepoint('还原点1');//dataSource.rollaback;会全部回滚
end;
end;
dataResult := statement.RowsAffected;//事物回滚扔返回1条数据被影响
showmessage('*作影响记录数:' + inttostr(dataResult));
statement.Close;
dataSource.Close;
{
本函数的知识点:
1、设置事物手动提交;
2、设置还原点,可回滚到某个位置;
3、事物手动提交的API;
4、执行语句影响到数据库的记录数;
5、异常处理;
}
end;
end.
通过本文代码对于新手来说,可以知道的知识点有:
(1)传递参数使用预编译的方式,防止注入;
(2)获取查询的总记录数;
(3)循环结果集获取每个字段的值;
(4)拼接字符串值使用''为一个'的转义,同plsql语法;
(5)设置事物手动提交;
(6)设置还原点,可回滚到某个位置;
(7)事物手动提交的API;
(8)执行语句影响到数据库的记录数;
(9)异常处理;
点赞