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)
)
)
Delphi使用TADOQuery的RowsAffected属性时需要注意的一个点的更多相关文章
- Delphi中TStringList类常用属性方法详解
TStrings是一个抽象类,在实际开发中,是除了基本类型外,应用得最多的. 常规的用法大家都知道,现在来讨论它的一些高级的用法. 先把要讨论的几个属性列出来: 1.CommaText 2.Delim ...
- delphi 中Adoquery ,在打开时能否让记录指针不移动? [问题点数:40分,结帖人microd]
delphi 中Adoquery ,在打开时能否让记录指针不移动?由于数据集Adoquery 时,它的针指称动会废时,能否在打开完成之前不让记录指针不移动.打开完毕之后再回复移动? 这样用:self. ...
- 数据库表中存在Text类型的属性时,写sql语句时需要注意喽!
之前,习惯性地写查询语句时,查询条件用“=”判断.今天写程序的时候,查询时突然报了一个错误:数据类型text 和varchar 在equal to 运算符中不兼容.查看了一下数据库发现,其中有一个属性 ...
- block作为类的属性时用copy
1. block作为类的属性时用copy Block属性的声明,首先需要用copy修饰符,因为只有copy后的Block才会在堆中,栈中的Block的生命周期是和栈绑定的 <栈 :由系统维护的局 ...
- zepto在操作dom的selected和checked属性时尽量使用prop方法
zepto在操作dom的selected和checked属性时尽量使用prop方法.
- delphi RTTI 四 获取类属性列表
delphi RTTI 四 获取类属性列表 GetPropList(btn1.ClassInfo, tkAny, PropList) PropCount := GetTypeData(btn1.Cla ...
- delphi XE7 在Android编译SharedActivity时出错
delphi XE6 在Android编译SharedActivity时正常,但xe7下编译出错,在uses添加Androidapi.Helpers就可以.
- html5 video使用autoplay属性时,声音混乱
html5 video使用autoplay属性时,声音混乱 页面代码 Index.html <html xmlns="http://www.w3.org/1999/xhtml" ...
- Delphi+MySQL:TADOQuery使用插入中文乱码解决方法
Delphi+MySQL:TADOQuery使用插入中文乱码解决方法 with adoquery dobeginclose;sql.clear;sql.text:=' insert into test ...
随机推荐
- PAT Basic 1052 卖个萌 (20 分)
萌萌哒表情符号通常由“手”.“眼”.“口”三个主要部分组成.简单起见,我们假设一个表情符号是按下列格式输出的: [左手]([左眼][口][右眼])[右手] 现给出可选用的符号集合,请你按用户的要求输出 ...
- 三种方式构建C#单例模式
/// <summary> /// 双检锁实现单例 /// </summary> public sealed class SingletonDoubleCheck { //s_ ...
- 【组合数学】AGC036C - GP 2
找性质的能力不行 Problem Statement We have a sequence of $N$ integers: $x=(x_0,x_1,\cdots,x_{N−1})$. Initial ...
- 【CF1218E】Product Tuples
题目大意:给定一个长度为 \(N\) 的序列,求从序列中选出 \(K\) 个数的集合乘积之和是多少. 题解: 由于是选出 \(K\) 个数字组成的集合,可知对于要计算的 \(K\) 元组来说是没有标号 ...
- [2019牛客多校第二场][G. Polygons]
题目链接:https://ac.nowcoder.com/acm/contest/882/G 题目大意:有\(n\)条直线将平面分成若干个区域,要求处理\(m\)次询问:求第\(q\)大的区域面积.保 ...
- MFC 画笔CPen、画刷CBrush
新建单个文档的MFC应用程序,类视图——View项的属性——消息,WM_PAINT,创建OnPaint()函数 dc默认有一个画笔(实心1像素宽黑线). CPen画笔非实心线像素宽必须为1,否则膨胀接 ...
- one(type,[data],fn) 为每一个匹配元素的特定事件(像click)绑定一个一次性的事件处理函数。
one(type,[data],fn) 概述 为每一个匹配元素的特定事件(像click)绑定一个一次性的事件处理函数. 在每个对象上,这个事件处理函数只会被执行一次.其他规则与bind()函数相同.这 ...
- linux终端相关概念解释及描述
基本概念: 1. tty(终端设备的统称): tty一词源于Teletypes,或者teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘通过阅读和发送信息的东西,后来这东西被 ...
- Codevs 1629 01迷宫
1629 01迷宫 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 有一个由01组成的n*n格迷宫,若你位于一格0上,那么你可 ...
- [Linux]ubuntu更改国内源
转自: https://blog.csdn.net/qq_35451572/article/details/79516563 推荐快速更新国内源 https://blog.csdn.net/qq_35 ...