Delphi实现简单处理数据库

Delphi
placeholder image
admin 发布于: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作,本篇文章的示例都已经实现了,详细参考如下:

参考代码

image.png

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.

运行效果

连接数据库效果.jpg

通过本文代码对于新手来说,可以知道的知识点有:

(1)传递参数使用预编译的方式,防止注入;

(2)获取查询的总记录数;

(3)循环结果集获取每个字段的值;

(4)拼接字符串值使用''为一个'的转义,同plsql语法;

(5)设置事物手动提交;

(6)设置还原点,可回滚到某个位置;

(7)事物手动提交的API;

(8)执行语句影响到数据库的记录数;

(9)异常处理;

 点赞


 发表评论

当前回复:作者

 评论列表


留言区