• 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)
        )
      )
    
  • 相关阅读:
    [转]C++引用
    安装Charles报错
    BigDecimal用法详解
    Map类集合
    Dubbo定义及其作用
    idea常用插件
    GitLab常用命令
    激活idea
    开发微信公众账号报错 返回码详细解释
    微信公众号 iOS UITextFiled 用中文键盘输英文出现空格的解决方法
  • 原文地址:https://www.cnblogs.com/jijm123/p/11303605.html
Copyright © 2020-2023  润新知