测试环境是: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. string::c_str

    const char* c_str() const noexcept;功能:返回c风格字符转 #include <iostream>#include <string>#incl ...

  2. 用JavaScript更新CSS变量

    HTML <div class="mover"></div> CSS .mover { width: 50px; height: 50px; backgro ...

  3. 【经典dp 技巧】8.13序列

    经典的拆绝对值 题目大意 给定$n$个具有顺序的序列,允许对每个序列循环移动.记第$i$个序列尾元素为$x$,$i+1$个序列首元素为$y$,定义其连接收益为$|x-y|*i$,求$n$个序列连接最大 ...

  4. C# 反射 (15)

    本章要点 自定义特性 反射 自定义特性运行把自定义元数据与程序元素关联起来.这些元数据时再编译过程中创建的并嵌入到程序集中. 反射是计算机术语,它描述在运行过程中检查和处理程序元素的功能. 反射允许完 ...

  5. windows下多个python版本共存 及安装Django

    了解python的人都知道python有2.x版本和3.x版本,而python3.x版本不向下兼容,但是根据具体的需要,有时候要2.x和3.x共存,python共存本身没有问题,只是需要设置一些环境变 ...

  6. <<代码大全>>阅读笔记之二 变量名的力量

    1.变量命名的注意事项 1)可理解性 变量要望文知义,看到这个变量不用看其他的代码就知道这个变量表示什么意思 好的变量命:currentDate, heartRate 糟糕的变量名:newButton ...

  7. @Test 测试

    package com.自定义.mall.admin.system; import java.util.List; import java.util.Map; import javax.annotat ...

  8. C++全局变量的定义和声明

    编译单元 编译分为两个步骤: 第一步:将每个.cpp或.c和相应的.h文件编译乘obj文件(包含预编译,汇编.编译) 第二部:将obj文件进行Link,生成最终的可执行文件 根据该阶段错误大致可分为两 ...

  9. 51 Nod 1354 选数字(体现动态规划的本质)

    1354 选数字  基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题  收藏  关注 当给定一个序列a[0],a[1],a[2],...,a[n-1] 和一个整数K时 ...

  10. HDU - 6150 构造题

    最近的vj好垃圾,老崩,实名吐槽 HDU - 6150 题意:给出一个错误的求最小点覆盖的函数,需要来构造一组样例,使得那个函数跑出来的答案是正解的3倍以上. 很巧妙的构造技巧,首先想法就是弄一个二分 ...