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

测试环境是: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)
    )
  )

猜你喜欢

转载自www.cnblogs.com/railgunman/p/12121203.html