query和数据库连接,不用dbgrid和datasource,为什么我用query.recordcount得到的是0呢?

shmilyjiujiu 2003-09-29 03:01:15
query和数据库连接,不用dbgrid和datasource,查询数据,为什么我用query.recordcount得到的是0呢? 数据库里面是有数据的。
我加上dbgrid和datasource之后,再用query.recordcount就能得到正确的数量了。

达人给个解释啊~~
...全文
105 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
lemon_wei 2003-09-30
  • 打赏
  • 举报
回复
在QUERY1的构SQL里面加上select * from 表名试试
huojiehai 2003-09-30
  • 打赏
  • 举报
回复
要计算RecordCount个数,最不要用recordcount,即使可以,数据量大时是很慢的,它要把一张表的所有数据下载到客户端计算个数, 用SQL :select Count(*) as mycount from table

最好,又准确又不影响效率
tom20803862 2003-09-30
  • 打赏
  • 举报
回复
我是这样碰到过,query1中field字都是Meom或者Bin类的(就是说DBGrid不能显示field)时,query1.RecordCount的值为0或-1, 我也不知道原因,我只好用另外SQL 语句来调用RecordCount.
huojiehai 2003-09-30
  • 打赏
  • 举报
回复
query1.RecordCount只对文件型数据库有效,如DB表,对于如SQL server和db2等的数据库是没效的,为0,这不是delphi的bug
mengxiang5160 2003-09-30
  • 打赏
  • 举报
回复
首先你应该是用odbc连接数据库才行
用odbc联检可能是正确的
你在试一试
FrameSniper 2003-09-30
  • 打赏
  • 举报
回复
Query是否正确连接到了数据库?
jinkang 2003-09-30
  • 打赏
  • 举报
回复
首先你应该是用odbc连接数据库才有以上问题。
由于你用了dbgrid和datasource,就把数据取到数据集中了,所以这时RecordCount才有值
否则没取过来,就没有值。
如果不通过odbc,而是直接连则一定可以取到。

hiflower 2003-09-30
  • 打赏
  • 举报
回复
还是用 ADO 吧
shmilyjiujiu 2003-09-30
  • 打赏
  • 举报
回复
var
// tqSerWindow:TQuery;
i,iWindowId:integer;
begin
if TblWindowsManage.FieldValues['windowid']=null then
exit;
if PgcSysManage.ActivePageIndex=1 then
begin
iWindowId:=TblWindowsManage.FieldValues['windowid'];

//增加窗口对应业务信息
tqSerWindow.Close;
tqSerWindow.SQL.Clear;
tqSerWindow.SQL.Add('select * from serviceinfo ');
tqSerWindow.SQL.Add('where serviceinfo.serviceid not in ');
tqSerWindow.SQL.Add('(select service.serviceid from service where service.windowid=:Serviceid)');
tqSerWindow.SQL.Add(' order by ServiceID');
tqSerWindow.ParamByName('Serviceid').AsInteger:=iWindowId;
tqSerWindow.Open;

//增加已经存在的业务信息
TqBeSerInfo.Close;
TqBeSerInfo.SQL.Clear;
TqBeSerInfo.SQL.Add('select * from serviceinfo ');
TqBeSerInfo.SQL.Add('where serviceinfo.serviceid in ');
TqBeSerInfo.SQL.Add('(select service.serviceid from service where service.windowid=:Serviceid)');
TqBeSerInfo.SQL.Add(' order by ServiceID');
TqBeSerInfo.ParamByName('Serviceid').AsInteger:=iWindowId;
TqBeSerInfo.Open;
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('select * from serviceinfo ');
Query1.Open;

LtvSInfo.Clear;
LtvBeSInfo.Clear;
for i:=0 to tqSerWindow.RecordCount-1 do
begin
with LtvSInfo.Items.Add do
begin
Caption:=tqSerWindow.FieldByName('serviceid').AsString;
SubItems.Add(tqSerWindow.FieldByName('servicechinese').AsString);
SubItems.Add(tqSerWindow.FieldByName('serviceenglish').AsString);
end;
tqSerWindow.Next;
end;
LtvSInfo.Column[0].Width := 50;
LtvSInfo.Column[1].Width := 150;
LtvSInfo.Column[2].Width := 150;
for i:=0 to TqBeSerInfo.RecordCount-1 do
begin
with LtvBeSInfo.Items.Add do
begin
Caption:=TqBeSerInfo.FieldByName('serviceid').AsString;
SubItems.Add(TqBeSerInfo.FieldByName('servicechinese').AsString);
SubItems.Add(TqBeSerInfo.FieldByName('serviceenglish').AsString);
end;
TqBeSerInfo.Next;
end;
LtvBeSInfo.Column[0].Width := 50;
LtvBeSInfo.Column[1].Width := 150;
LtvBeSInfo.Column[2].Width := 150;
end;
end;

上面的是源码,query是为了解决问题临时加的。加了后就好了 奇怪啊~~~
shmilyjiujiu 2003-09-30
  • 打赏
  • 举报
回复
哪位dx能说说原理啊??


我的目的是这样的:我简化了一些 但是总体是这样的。

窗口上放了两个listview,分别显示已经发生业务的窗口 和没有发生业务的窗口,共涉及到两个表,业务窗口对应表tServiceWindow和窗口表tWindow。
我用了两个query(queryA,queryB)连接 ,分别用
A语句:select * from tWindow not in (select * from tServiceWindow)

B语句:select * from tWindow not in (select * from tServiceWindow)
来取出数据,先执行这两条sql语句后,在用
for i:=0 to query.recordcount do
begin
将取出的数据放到两个listview中;
end;
这个时候就有问题了。
因为是先执行A,再是B,两者之间没有别的代码,所以结果就是只能保存A的数据,B的数据丢失了。
我用断点跟 ,发现是这样的错误,
在A执行完之后,没有执行B之前,A语句用的query(假设为QueryA)的recordcount是0,当
执行B的时候 queryA的recordercount的数据就成了正常了。但是queryB的recordercount数据就不正常。 郁闷啊
我是这样解决的。
又放了一个queryC在上面,任意执行一个执行select的代码,取出tWindow 表中的内容,
这样子就好了~~~~~~~~~
大寒啊 哪位给个解释啊~~????
jinkang 2003-09-30
  • 打赏
  • 举报
回复
query1.RecordCount只对文件型数据库有效,如DB表,对于如SQL server和db2等的数据库是没效的,为0,这不是delphi的bug


楼上的说法不对,在mssql,sybase中都可以取到该属性,前提是数据下载到客户端。
但下面的说法是正确的。

要计算RecordCount个数,最不要用recordcount,即使可以,数据量大时是很慢的,它要把一张表的所有数据下载到客户端计算个数
shmilyjiujiu 2003-09-29
  • 打赏
  • 举报
回复
因为delphi的数据集中没有数据,只有数据加载到delphi的数据集中后,RecordCount才有值


楼上的兄弟 请详细解释一下你说的这句话的意思吧。是数据集中不可能有数据呢,还是说要等一段时间才可以???
jinkang 2003-09-29
  • 打赏
  • 举报
回复
如果是BDE直接连接数据库,则以上问题不存在。
如果BDE通过ODBC访问数据库,如果没有取出数据,则此时RecordCount是0(-1?)。
因为delphi的数据集中没有数据,只有数据加载到delphi的数据集中后,RecordCount才有值,所以数据量大时,RecordCount要比较长的时间才能得到。
sheepcyk 2003-09-29
  • 打赏
  • 举报
回复
不可能,在检查检查,不会是你发现了delphi的bug了吧
IORILI 2003-09-29
  • 打赏
  • 举报
回复
靠,database慢得要死
sailer_shi 2003-09-29
  • 打赏
  • 举报
回复
存在是应该存在的,只不过是那你数据库中没有数据,当然是0了,如果要是有数据的话那就是连接错了数据库
dickeybird888 2003-09-29
  • 打赏
  • 举报
回复
你所说的问题根本就不存在哈哈!
shmilyjiujiu 2003-09-29
  • 打赏
  • 举报
回复
哦 补充一下 我是通过database和数据库连接的 数据库用的是sqlserver

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧