Delphi使用TADOQuery的RowsAffected属性时需要注意的一个点

测试环境是:Delphi 6、Oracle、PLSQL

先创建一个模拟测试的数据表,并且添加几条模拟的数据

create table practice(uno varchar(8), uname varchar(20));

insert into practice values ('1', '1');
insert into practice values ('1', '1');
insert into practice values ('2', '2');
insert into practice values ('1', '1');
commit;

本文使用TADOConnection、TADOQuery并不是以拖动控件、配置控件属性的方式,而是直接通过写代码,如果想看使用控件的例子,可以参见:Delphi使用ADO进行数据库编程

使用ADOQuery执行SQL的之后,可以通过RowsAffected属性获取该SQL影响了数据表中的几行数据,但是根据拼接的SQL的形式的不同可能会有不同的效果,如果不注意则会可能在需要使用RowsAffected的时候出现问题,下面通过代码来展示一下,有两个按钮,展示两种SQL形式的不同效果.

代码逻辑和运行效果会在程序中解释,包括

  • 数据库连接串
  • ADOQuery和ADOConnection的使用
  • 不同方式拼接的SQL导致最后RowsAffected的值的效果
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, StdCtrls;

type
  TForm1 = class(TForm)
    btn1: TButton;
    btn2: TButton;
    procedure btn1Click(Sender: TObject);
    procedure btn2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);
var
  adoConnection: TAdoConnection;
  adoQuery: TAdoQuery;
  sql: string;
  count: Integer;
begin
  adoConnection:= TAdoConnection.Create(nil);
  adoConnection.ConnectionString := 'Provider=OraOLEDB.Oracle.1;Persist Security Info=False;Data Source=TestSource' ;
  adoConnection.Open('testUser', 'testPassword');     //第一个参数是用户名,第二个参数是密码
  //或者可以将用户名密码的信息放到数据库连接串,然后直接调用adoConnection.Open;而不是adoConnection.Open('testUser', 'testPassword'); 
  //adoConnection.ConnectionString := 'Provider=OraOLEDB.Oracle.1;Persist Security Info=False;User ID=testUser;Password=testPassword;Data Source=TestSource' ;
  //adoConnection.Open;
 
  adoQuery:= TADOQuery.Create(nil);
  adoQuery.Connection := adoConnection;
  
  //这种方式拼接的SQL最后执行之后获取的RowsAffected是真正被更新的行数
  sql:= 'UPDATE practice SET uname = ''test'' where uno = ''1'' ';		//这种时候SQL的结尾不要有 ;
  adoquery.SQL.Text:= sql;
  {如果在PLSQL中执行上面的SQL,那么需要添加Commit才能真正修改
    但是在代码中使用这样的SQL,并且通过adoQuery.ExecSQL;方式执行SQL,其实不需要在拼接的SQL中显式添加Commit的,会自动提交的
  	}

  //使用这种方式拼接的SQL,执行之后获取的RowsAffected总是1
  sql:=  'UPDATE practice SET uname = ''test'' where uno = ''10''; ';		//这种时候SQL的结尾必须要有 ;
  adoquery.SQL.Text:= 'Begin ' + sql + ' Commit;  End;';
  count:= adoQuery.ExecSQL;		//执行adoQuery.ExecSQL的返回值其实就是等于adoQuery.RowsAffected的值

  //ShowMessage('修改了' + IntToStr(count) + ' 条记录');
  ShowMessage('修改了' + IntToStr(adoQuery.RowsAffected) + ' 条记录');
  //使用上面制造的那样的模拟数据,这里的弹出显示: 修改了3条记录

  adoQuery.Free;
  adoConnection.Free;
end;

procedure TForm1.btn2Click(Sender: TObject);
var
  adoConnection: TAdoConnection;
  adoQuery: TAdoQuery;
  sql: string;
  count: Integer;
begin
  adoConnection:= TAdoConnection.Create(nil);
  adoConnection.ConnectionString := 'Provider=OraOLEDB.Oracle.1;Persist Security Info=False;Data Source=TestSource' ;
  adoConnection.Open('testUser', 'testPassword');     //第一个参数是用户名,第二个参数是密码
  //或者可以将用户名密码的信息放到数据库连接串,然后直接调用adoConnection.Open;而不是adoConnection.Open('testUser', 'testPassword'); 
  //adoConnection.ConnectionString := 'Provider=OraOLEDB.Oracle.1;Persist Security Info=False;User ID=testUser;Password=testPassword;Data Source=TestSource' ;
  //adoConnection.Open;
 
  adoQuery:= TADOQuery.Create(nil);
  adoQuery.Connection := adoConnection;
  
  //使用这种方式拼接的SQL(在原有的SQL中加了commit;),执行之后获取的RowsAffected总是1
  //就算其没有更新任何一行,最后RowsAffected值会是1,就算其更新了10行,最后RowsAffected的值还是1
  sql:=  'UPDATE practice SET uname = ''test'' where uno = ''10''; ';		//这种时候SQL的结尾必须要有 ;
  adoquery.SQL.Text:= 'Begin ' + sql + ' Commit;  End;';
  count:= adoQuery.ExecSQL;		//执行adoQuery.ExecSQL的返回值其实就是等于adoQuery.RowsAffected的值

  //ShowMessage('修改了' + IntToStr(count) + ' 条记录');
  ShowMessage('修改了' + IntToStr(adoQuery.RowsAffected) + ' 条记录');
  //使用上面制造的那样的模拟数据,这里的弹出显示: 修改了1条记录

  adoQuery.Free;
  adoConnection.Free;
end;

end.

补充说明一下数据库连接串

数据库连接串 adoConnection.ConnectionString := ‘Provider=OraOLEDB.Oracle.1;Persist Security Info=False;User ID=testUser;Password=testPassword;Data Source=TestSource’ ;

  • Provider:数据库驱动
  • Persist Security Info:
  • User ID:数据库用户
  • Password:数据库用户对应的密码
  • Data Source:数据源,数据源的解释可以看下面的数据库相关的配置文件

补充:tnsnames.ora文件

我们在Oracle客户端配置连接Oracle的信息的时候,其实最后配置的连接信息是保存到tnsnames.ora这个配置文件中的

在tnsnames.ora中配置的数据库连接信息,也就是数据源等信息,可以配置多个,下面只以一个来作为例子展示

#TestSource就是数据源的名称,和数据库连接串中的Data Source=TestSource 相对应
TestSource =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.88.79)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = orcl)
    )
  )
好的代码像粥一样,都是用时间熬出来的
 
转自: https://www.cnblogs.com/jijm123/p/11303605.html
原文地址:https://www.cnblogs.com/railgunman/p/12121203.html