DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: iushoviskdors
今日帖子: 32
在线用户: 10
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 xiangsong (天下第一菜) ★☆☆☆☆ -
盒子活跃会员
2003/5/27 11:06:55
标题:
请教一个SQL的问题 浏览:1918
加入我的收藏
楼主: 请问各位高手,我在检索一个表中的数据时,用的是类似这样的语句,
    str_sql := 'select id,name from teacher where flag  = 'a'';
    sql.add(str_sql);
    open;
可是,运行时当数据库里没有数据的时候会出错,''is not a valid integer value,请问在delphi里如何检测数据库里有没有数据,还是有其它更合理的办法。
谢谢各位。
----------------------------------------------
天下第一菜

那一天我在街头踯躅
你在秋天里独自跳舞
回首落满悲欢的来时路
那覆水难收的赌注
我们用青春一起作证
我们曾遇见到幸福
作者:
女 ahfann (ahfann) ★☆☆☆☆ -
普通会员
2003/5/27 11:16:08
1楼: if ado.eof=true then
值:=0
else 值:=???
----------------------------------------------
我不会,所以我问,我会,所以想知道更多!
作者:
男 xiangsong (天下第一菜) ★☆☆☆☆ -
盒子活跃会员
2003/5/27 11:27:25
2楼: 谢谢ahfann,你用的是ado控件,可是我用的是是query,我也想过你这种办法,可是当我运行到open的时候它就已经出错退出了。怎么办?
----------------------------------------------
天下第一菜

那一天我在街头踯躅
你在秋天里独自跳舞
回首落满悲欢的来时路
那覆水难收的赌注
我们用青春一起作证
我们曾遇见到幸福
作者:
女 ahfann (ahfann) ★☆☆☆☆ -
普通会员
2003/5/27 11:33:08
3楼: str_sql := 'select id,name from teacher where flag  = '+char(39)+'a'+char(39);改成这样再试试!

----------------------------------------------
我不会,所以我问,我会,所以想知道更多!
作者:
女 ldyocean (ldyocean) ★☆☆☆☆ -
盒子活跃会员
2003/5/27 11:34:41
3楼: or flag is null

也可能是nil

我也忘记了,你试试吧
----------------------------------------------
-
作者:
女 ruby_li (ruby) ★☆☆☆☆ -
注册会员
2003/5/27 13:30:17
4楼: 我试过你的代码,
没有问题。
如果要判断表是否为空,可以用
select count(*) from teacher.
另外,sql.add(),之前,sql的语句也许有错。
----------------------------------------------
笨笨
作者:
男 xiangsong (天下第一菜) ★☆☆☆☆ -
盒子活跃会员
2003/5/27 15:37:43
5楼: 谢谢各位,可我试 ahfann 的方法也出同样的错误信息。我试了ldyocean的方法,在SQL查询分析器里运行没问题,能查询出一条空值来,可是在程序里运行,错误信息同上边一样。我输入一条flag的值不为'a'的记录,呵呵,依然是出上面我说的那条错误信息,这是怎么了?
呵呵,我想判断表为空也不能完全解决问题,因为里面可能还有flag的值不为'a'的记录。谢谢ruby_li 。
我把出错信息全写出来,大家帮我看看。
Project project_students_manager.exe raised exception class EconvertError with message ''is not a valid integer value'.Process stopped .
我看不明白,我的这个往外读的字段'id'的类型是char.怎么会提示一个无效的integer值呢?真不明白。
----------------------------------------------
天下第一菜

那一天我在街头踯躅
你在秋天里独自跳舞
回首落满悲欢的来时路
那覆水难收的赌注
我们用青春一起作证
我们曾遇见到幸福
作者:
女 ruby_li (ruby) ★☆☆☆☆ -
注册会员
2003/5/27 16:01:02
6楼: 我特意在sql server 建了个teacher(id,name, flag)表,
把 你的代码copy在delphi 6 中,
我想是你的其他代码的问题,象你所说的值不为a 的纪录,也有这样的错误,
那应该不是此处的错误
查一下其他代码吧

文字
----------------------------------------------
笨笨
作者:
男 xiangsong (天下第一菜) ★☆☆☆☆ -
盒子活跃会员
2003/5/27 16:17:51
7楼: 谢谢 ruby_li 老兄如此费心,不过在open 之前,我已经clear过了。
with query1 do
begin
  close;
  sql.clear;
  str_sql := 'select id as str_maxid from teacher where flag  = 'a'';
  sql.add(str_sql);
  open;
  edit1.text := fieldbyname('str_maxid').asstring;
end;
这几条语句也实在是看不出有何错误了,别的语句更是和这些没有联系。可是一执行到open处就出错。气死我了。
----------------------------------------------
天下第一菜

那一天我在街头踯躅
你在秋天里独自跳舞
回首落满悲欢的来时路
那覆水难收的赌注
我们用青春一起作证
我们曾遇见到幸福
作者:
女 ahfann (ahfann) ★☆☆☆☆ -
普通会员
2003/5/27 16:20:12
7楼: 你运行是在哪里通不过呢?是在open前,还是后啊?
----------------------------------------------
我不会,所以我问,我会,所以想知道更多!
作者:
男 xiangsong (天下第一菜) ★☆☆☆☆ -
盒子活跃会员
2003/5/27 16:21:39
8楼: 我单步运行时,就是运行open这一句时马上出错。
----------------------------------------------
天下第一菜

那一天我在街头踯躅
你在秋天里独自跳舞
回首落满悲欢的来时路
那覆水难收的赌注
我们用青春一起作证
我们曾遇见到幸福
作者:
女 ahfann (ahfann) ★☆☆☆☆ -
普通会员
2003/5/27 16:32:25
9楼: 你数据库的flag是什么类型,a又是什么呢?
----------------------------------------------
我不会,所以我问,我会,所以想知道更多!
作者:
男 xiangsong (天下第一菜) ★☆☆☆☆ -
盒子活跃会员
2003/5/27 16:44:24
10楼: 我的数据库的flag的类型是char,长度为1,我的想法是让flag这个字段作为一个标志,如果flag的值为a则说明这条记录为正常,其它的值举例说比如为x,则x作为删除标志,表示这条记录已删除,不再显示。
我在试这条sql语句的时候,试着把where子句去掉,当库里有flag的值不为a 的记录时当然能检索,可是要是这个表里没有数据,还是一样出现我写在上边的错误信息。
当然要是在这之前先检索记录总数是否为0,再作处理也能预防这种事发生,可是我觉得这得检索两遍,未免有点浪费,一定还会有非常简单的办法,你们作类似的东西的时候,是怎么处理数据库为空的情况的?
多谢。
----------------------------------------------
天下第一菜

那一天我在街头踯躅
你在秋天里独自跳舞
回首落满悲欢的来时路
那覆水难收的赌注
我们用青春一起作证
我们曾遇见到幸福
作者:
女 ahfann (ahfann) ★☆☆☆☆ -
普通会员
2003/5/27 16:52:24
11楼: 哦,我知道了,你是不是,记录里的flag字段有为空值,其它字段有值,
看看是不是?
----------------------------------------------
我不会,所以我问,我会,所以想知道更多!
作者:
女 ahfann (ahfann) ★☆☆☆☆ -
普通会员
2003/5/27 16:59:53
12楼: with query1 do
begin
  close;
  sql.clear;
  str_sql := 'select id as str_maxid from teacher where flag  = '+char(39)+'a'+char(39);
  sql.add(str_sql);
  open;
end;
if query1.eof=true then
 edit1.text := '0' else
 edit1.text := fieldbyname('str_maxid').asstring;


----------------------------------------------
我不会,所以我问,我会,所以想知道更多!
作者:
男 xiangsong (天下第一菜) ★☆☆☆☆ -
盒子活跃会员
2003/5/27 16:59:54
12楼: 是呀,这怎么办?可是当我输入一个flag值不为a 的记录时,还会出现这种错误,这回flag的值可不为空呀。而且我写成
str_sql := 'select id as str_maxid from teacher where flag  = 'a' or flag is null';
的时候依然要出错,真是神奇。
我以前用PB的时候可就没这些问题。空值也不会出错。真是可气。

----------------------------------------------
天下第一菜

那一天我在街头踯躅
你在秋天里独自跳舞
回首落满悲欢的来时路
那覆水难收的赌注
我们用青春一起作证
我们曾遇见到幸福
作者:
女 ruby_li (ruby) ★☆☆☆☆ -
注册会员
2003/5/27 17:04:14
13楼: 也许你的程序里有query1.afteropen, or ,query1.beforeopen
等事件?

----------------------------------------------
笨笨
作者:
男 xiangsong (天下第一菜) ★☆☆☆☆ -
盒子活跃会员
2003/5/27 17:27:53
14楼: 呵呵,谢谢两位姑娘,不过我没有ruby_li所说的这些事件,我刚才用ahfann 的语句试了一试,设了断点,发现不知为何open这句能够通过了,估计是在之后的
str_id := inttostr(strtoint(fieldbyname('str_maxid').asstring) + 1);
这里出我错,我想恐怕是因为str_maxid为空的缘故。
可是,为什么EOF的值不为true,而str_maxid的值为空呢?
我试着写了一条语句:
if query1.eof then showmessage(fieldbyname('str_maxid').asstring);
发现不显示这个对话框, 要是改成
if not query1.eof then showmessage(fieldbyname('str_maxid').asstring);
也就是加上not ,就会显示,但显示出来的对话框是空的?呵呵,又是这么奇怪,为何没到eof值不为true 而select 出来的值又是空的呢?


----------------------------------------------
天下第一菜

那一天我在街头踯躅
你在秋天里独自跳舞
回首落满悲欢的来时路
那覆水难收的赌注
我们用青春一起作证
我们曾遇见到幸福
作者:
男 xiangsong (天下第一菜) ★☆☆☆☆ -
盒子活跃会员
2003/5/27 17:42:16
15楼: 呵呵,不管怎么样,虽还有难解之处,总算问题可以解决了,萍水相逢,劳各位如此费心,谢谢,再次谢谢各位 GG MM。
----------------------------------------------
天下第一菜

那一天我在街头踯躅
你在秋天里独自跳舞
回首落满悲欢的来时路
那覆水难收的赌注
我们用青春一起作证
我们曾遇见到幸福
作者:
女 ahfann (ahfann) ★☆☆☆☆ -
普通会员
2003/5/27 18:12:21
16楼: 那是因为有记录,但是id的值为空!所以会出错!
比如
表中:id flay
      空 a    
这样查出来的eof为false
而id 值什么都没有!

----------------------------------------------
我不会,所以我问,我会,所以想知道更多!
作者:
男 fidido (swGuitar) ★☆☆☆☆ -
盒子活跃会员
2003/5/27 22:24:47
17楼: 收藏按此在新窗口浏览图片
----------------------------------------------
我我,我是一只菜鸟,菜菜菜菜菜菜,菜菜菜菜菜菜菜菜菜菜菜菜~~~~~~~~~按此在新窗口浏览图片
作者:
男 Another (Another) ★☆☆☆☆ -
盒子活跃会员
2003/5/28 7:24:31
18楼: 精彩!
这么精彩的讨论没有赶上!
不知道为什么我总感觉用
Format格式化字符串比较清晰
不愿意用加号连接多个单引号
不知为什么?
不过用Format是比较清晰一些的
如:
sSql := Format('Select id,name,flag 
                Form Table 
                Where flag = %s',['a']) ;
搞定!


另外有些时候可以另种方法使用异常!
如一张表:
id name flag
-------------
1  a    y
2  b    y
3  c    y
............
----------
记录如上:
如想查询name为d的,并取出字段
如这样写:
Query.Sql.Add(Format('Select * From tab where name=%s',['d'])) ;
Open
肯定出错了
如必定这样:
try
  Query.Sql.Add(Format('Select * From tab where name=%s',['d'])) ;
  Open ;
except
  MsgBox('No Record') ;
  Exit ;
end  ;

这样Open出错
触发异常
出现没有记录对话框
处理零记录情况


----------------------------------------------
按此在新窗口浏览图片
作者:
男 xiangsong (天下第一菜) ★☆☆☆☆ -
盒子活跃会员
2003/5/28 8:18:24
19楼: 回答ahfann MM,我开始猜想也可能是你说的这个原因,所以我特意把表中的记录都删了,可是问题依旧,eof 不为true,而取出的最大id 为空。可这个‘空’还不是null,呵呵,不知你明白不明白我的意思,因为接下来我用这样的语句处理数据库为空的情况:
 if fieldbyname('str_maxid').asstring = ' then
   str_id := '0000000001'
 else
   ......;
表中没记录时能够执行then后的语句,也就是使str_id := '0000000001',这是怎么回事?我觉得'和null是不一样的。是不是。
回答Another ,我刚学delphi月余,差得还远,我没有用过format,等我查查帮助,看看format是怎么回事。你说的异常处理虽然也不错,可是我个人看法,觉得还是不够理想,我想还是应该先检测是否表为空,再加以处理为好。
谢谢各位高手的关注。谢谢。
----------------------------------------------
天下第一菜

那一天我在街头踯躅
你在秋天里独自跳舞
回首落满悲欢的来时路
那覆水难收的赌注
我们用青春一起作证
我们曾遇见到幸福
作者:
女 ruby_li (ruby) ★☆☆☆☆ -
注册会员
2003/5/28 8:57:39
20楼: 判断表是否为空,应该用
if query1.eof and query1.bof then 

else

----------------------------------------------
笨笨
作者:
男 xiangsong (天下第一菜) ★☆☆☆☆ -
盒子活跃会员
2003/5/28 9:32:07
21楼: 谢谢姑娘指点,道理当然是这个道理,我也感觉这话写进教科书也不会有问题,呵呵,可是,我这里一个eof的值已经不为true,再加and ,也没有用的,更加不会为true了。唉,真是难为大家了,明明是空表,就是无法判断。奇怪,还能有什么问题呢?
----------------------------------------------
天下第一菜

那一天我在街头踯躅
你在秋天里独自跳舞
回首落满悲欢的来时路
那覆水难收的赌注
我们用青春一起作证
我们曾遇见到幸福
作者:
女 ahfann (ahfann) ★☆☆☆☆ -
普通会员
2003/5/28 10:15:30
22楼: 那你删除没有完全,我觉得不可能这样的!
你有没有完全删呢?
你用pb查查看,先用命令truncate table *;
然后再运行看!
我不相信!不可能这么怪!
----------------------------------------------
我不会,所以我问,我会,所以想知道更多!
作者:
男 xiangsong (天下第一菜) ★☆☆☆☆ -
盒子活跃会员
2003/5/28 11:06:47
23楼: 我也觉得有点怪,对不起,我不明白你说的这个truncate table *;是怎么回事,没用过。能不能再加解释?
我刚才用PB写了段程序试了试,在主窗口的open事件写了
dw_1.settransobject(sqlca)
dw_1.retrieve()
messagebox('记录总数',string(dw_1.rowcount());
pb里面有eof这个属性吗?我不太清楚,没用过,不过当表中没有数据时显示记录总数可是0。应该是全都删除了。这个没问题。
我在sql企业管理器中,对着仅余的空行努力的点右键,右键的弹出菜单里'删除选项'已经变灰了,呵呵,再不是空的,那我就真想去状告微软了。
你以前碰见这种问题的时候,eof的值没有过这种情况?
真怪
----------------------------------------------
天下第一菜

那一天我在街头踯躅
你在秋天里独自跳舞
回首落满悲欢的来时路
那覆水难收的赌注
我们用青春一起作证
我们曾遇见到幸福
作者:
女 ahfann (ahfann) ★☆☆☆☆ -
普通会员
2003/5/28 11:14:51
24楼: 没有遇到过这么怪的情况,怎么会全部数据都删除了,还会
运行以后的eof 还为false ,那说明还有数据,不可能会错的啊!
你是不是,数据库连接出错了!
连的是一个数据,删的是别的,而且查看的也是另外一个!
只有这个可能性了!要不,我觉得不可能!
----------------------------------------------
我不会,所以我问,我会,所以想知道更多!
作者:
男 xiangsong (天下第一菜) ★☆☆☆☆ -
盒子活跃会员
2003/5/28 15:21:48
25楼: 谢谢ahfann姑娘,我也觉得奇怪,我又换了个别的表,将里面的数据全部删除,再判断eof的值,确实是true。可唯独这个表不可以,呵呵,不过经过再三的琢磨,我想终于明白是什么原因了,因为我们的语句是
select max(id) from teacher 取的是最大值。要是换成:
select id from reacher  之后再检测eof的值,没有数据时就是true。

呵呵,原因肯定是这个原因,可惜我过于菜,知其然不知其所以然,那位大虾帮忙解释解释,以了结这段已延伸到了24楼的讨论。

----------------------------------------------
天下第一菜

那一天我在街头踯躅
你在秋天里独自跳舞
回首落满悲欢的来时路
那覆水难收的赌注
我们用青春一起作证
我们曾遇见到幸福
作者:
女 ahfann (ahfann) ★☆☆☆☆ -
普通会员
2003/5/28 15:26:14
26楼: 你怎么程序不写完整呢,这样,一会一个样!
取最大值当然是有值了,因为就算为空,最大值还是有啊,
那就是空!还以为是什么怪事呢!
----------------------------------------------
我不会,所以我问,我会,所以想知道更多!
作者:
男 xiangsong (天下第一菜) ★☆☆☆☆ -
盒子活跃会员
2003/5/28 15:39:31
27楼: 实在是不好意思,怪我怪我,我根本就没往这方面想,太糊涂了,一直没注意max(id)和id的区别,你这么说,我再看了看上面的贴子,果然根本没写出max(id),真是抱歉,耽误大家时间,还请各位见谅,尤其是ahfann姑娘,谢谢你。
----------------------------------------------
天下第一菜

那一天我在街头踯躅
你在秋天里独自跳舞
回首落满悲欢的来时路
那覆水难收的赌注
我们用青春一起作证
我们曾遇见到幸福
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v2.1 版权所有 页面执行39.0625毫秒 RSS