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

Delphi使用TADOQuery的RowsAffected属性时需要注意的一个点的更多相关文章

  1. Delphi中TStringList类常用属性方法详解

    TStrings是一个抽象类,在实际开发中,是除了基本类型外,应用得最多的. 常规的用法大家都知道,现在来讨论它的一些高级的用法. 先把要讨论的几个属性列出来: 1.CommaText 2.Delim ...

  2. delphi 中Adoquery ,在打开时能否让记录指针不移动? [问题点数:40分,结帖人microd]

    delphi 中Adoquery ,在打开时能否让记录指针不移动?由于数据集Adoquery 时,它的针指称动会废时,能否在打开完成之前不让记录指针不移动.打开完毕之后再回复移动? 这样用:self. ...

  3. 数据库表中存在Text类型的属性时,写sql语句时需要注意喽!

    之前,习惯性地写查询语句时,查询条件用“=”判断.今天写程序的时候,查询时突然报了一个错误:数据类型text 和varchar 在equal to 运算符中不兼容.查看了一下数据库发现,其中有一个属性 ...

  4. block作为类的属性时用copy

    1. block作为类的属性时用copy Block属性的声明,首先需要用copy修饰符,因为只有copy后的Block才会在堆中,栈中的Block的生命周期是和栈绑定的 <栈 :由系统维护的局 ...

  5. zepto在操作dom的selected和checked属性时尽量使用prop方法

    zepto在操作dom的selected和checked属性时尽量使用prop方法.

  6. delphi RTTI 四 获取类属性列表

    delphi RTTI 四 获取类属性列表 GetPropList(btn1.ClassInfo, tkAny, PropList) PropCount := GetTypeData(btn1.Cla ...

  7. delphi XE7 在Android编译SharedActivity时出错

    delphi XE6 在Android编译SharedActivity时正常,但xe7下编译出错,在uses添加Androidapi.Helpers就可以.

  8. html5 video使用autoplay属性时,声音混乱

    html5 video使用autoplay属性时,声音混乱 页面代码 Index.html <html xmlns="http://www.w3.org/1999/xhtml" ...

  9. Delphi+MySQL:TADOQuery使用插入中文乱码解决方法

    Delphi+MySQL:TADOQuery使用插入中文乱码解决方法 with adoquery dobeginclose;sql.clear;sql.text:=' insert into test ...

随机推荐

  1. Pycharm中查看内置函数的源码

    方法1.鼠标放在函数上,Ctrl+B,看源码 方法2.将光标移动至要查看的方法处,按住ctrl 键,点击鼠标左键,即可查看该方法的源码.

  2. java8 stream两个集体交集、差集、并集操作

    业务场景: 页面左右两个datagrid,双击左边datagrid行,移动到右边datagrid,右边datagrid行双击,移动到左边datagrid 点击保存,提交修改的数据到后台 后台要把查询到 ...

  3. python 单例与数据库连接池 及相关选择

    单例:专业用来处理连接多的问题(比如连接redis,zookeeper等),全局只有一个对象 单例代码 def singleton(cls): instances = {} def _singleto ...

  4. Cloneable注解使用

    使用 clone()方法的类必须 implement Cloneable 如果没有继承,clone()方法会报错 java.lang.CloneNotSupportedException异常

  5. dynamic类型

    dynamic类型在运行时做类型检查 可用于变量类型.方法参数和返回值类型 示例 dynamic person = new Student { Name = "张三", Age = ...

  6. Git 命令行解决冲突

    git add filename   将本地工作区文件加入缓存区 git commit filename -m '提交文件注释' git status  查看当前工作区状态 git fetch ori ...

  7. Series拼接回DataFrame

    从这样的表,如何计算一行汇总层拼接回去

  8. crontab踩坑(二):Unit crond.service could not be found.

    这是因为Ubuntu上的服务名称是cron不是crond.所以你的命令应该是: sudo service cron start

  9. Crystal Report中文顯示亂碼

    1.首先要確定該中文字體在OS裏有沒有安裝 C:\WINDOWS\Fonts 這個folder下沒有找到的話就從別的機器拷貝ttf字體文件,然後 File -> Install New Font ...

  10. 2018CCPC桂林站G Greatest Common Divisor

    题目描述 There is an array of length n, containing only positive numbers.Now you can add all numbers by ...