защо

16 отговора 589 прегледа
#1

защо

защо от време на време tquery обектите ми връщат recordCount = -1 когато в тях има много записи като изключим това си работят коректно?

Обикновено се получава при динамично създадени tquery

-------------
Special killer double trouble triple extra nicotine monster!
Отговор
в отговор на z_free #2

Re: защо

Здравей!
По това как си формулирал въпроса си мога да заключа че едвали това е единственият проблем който имаш.
На такъв въпрос има само един отговор и той е "така".
Венцислав Александрийски

Отговор
в отговор на z_free #3

Re: защо

Ако ползваш TQuery.RecordCount извиквай TQuery.FetchAll преди това.

Ако записите, които query-то връща са много, реално идват на порции - като Open-неш query-то идва първата част от тях и след това като scroll-ваш по записите и се наложи, идват останалите. В този случай RecordCount връща (-1).

HTH

Отговор
в отговор на v_automation #4

Re: защо

Е защо сега така? Човека си пита. Честно казано, може да няма достатъчно опит в тези неща, затова пита тук.
На мене ако ми се случи такова нещо, ще погледна малко сорс, ще пробвам по 1 или 2 начина и ако случайно не разбреа, тогава ще питам.

Нали за това са тези форуми...

---
...и аз пиша на кирилица!

Редактирано от ess на

Отговор
в отговор на afterglow #5

много просто

Пояснение:


var
qr: tquery;
...
qr := tquery.create(nil);
with qr do begin
databasename := 'restdata';
sql.text := 'select * from users';
<разхождане из записите>
showmessage(inttostr(recordcount)); // показва -1
free;
end;
qr.Databasename := 'restdata';
qr.sql.text := 'select * from users';

-

Не просто е много дразнещ, но и голям проблем. Случва се от време на време и главно на динамично създадени обекти.

Отговор
в отговор на z_free #6

ps

Последните два реда от кода са там по грешка, и сега не мога да ги едит. + в <разхождане по записите> се включва едно open :)

В момента не мога да опитам с fetch all, подозирам, че може и да не сработи. Все пак се разхождам по записите ..

-------------
Special killer double trouble triple extra nicotine monster!

Редактирано от z_free на

Отговор
в отговор на z_free #7

Re: много просто

Преди да изпълниш
sql.text := 'select * from users';

изпълни набързо (може и да не е толкоз бързо:) едно:
sql.text := 'select count(*) as RecordsCount from users';

и си вземи броя записи: FieldByName('RecordsCount').AsInteger

Ако в твоята ситуация е възможно де...

---
...и аз пиша на кирилица!
Отговор
в отговор на ess #8

не може, трябва решение, надявах се ..

В моя случай не може току така, защото sql изречението се генерира по време на изпълнение и се предава като параметър на функция, която създава tquery и го отваря. За да го реализирам така ще трябва да парс-вам изречението и да си генерирам ново със select count, което даже е рисковано понякога, а и бавно.

Надявах се някой да се е сблъсквал с това и да го е решавал ...

Отговор
в отговор на ess #9

Re: защо

Здравей!
Никой не се е родил научен и няма нищо лошо в това да попиташ, но не става дума за това.
Хубаво е че искаш да му помогнеш, но според мен нетрябваше да го правиш дакато не си формулира въпроса.
Ще ти хареса ли форум от вида:
тема: защо
тема: как
тема: защо
тема: защо
тема: защо
тема: как
тема: как
тема: кой
тема: ......
Коя от така записаните темите би те заинтересувала?
Приятно ли ти е да си кликаш на хаос по линковете?
Въпроса не е до това дали има опит, а как пита!
Ако пита базата както пита във форума значи резултата който получава е съвсем нормален и следователно няма какво да му се обяснява
Венцислав Александрийски

Отговор
в отговор на z_free #11

Re: много просто

qr := tquery.create(nil);
with qr do begin
databasename := 'restdata';
sql.text := 'select * from users';
open;
last;
first;

showmessage(inttostr(recordcount)); // показва -1
free;
end;


_ _ _

Time is like a drug. Too much of it kills you.
Отговор
в отговор на killall #12

Аха, само че колегата...

...нещо не го разбирам какво точно очаква. Може проблемът да не му е в това, в което си мисли, че е...

Отговор
в отговор на afterglow #13

killing in the name of

Очаквам, когато отворя query с просто select заявка, която връща пет записа, които съвсем коректно се четат (while not Eof do begin showmessage(qrF1.AsString); next; end; си показва съобщение пет пъти) -- тогава очаквам qr.RecordCount да е 5, a не -1.

Много я разтекохме темата, нищо не разбрахме ....

-------------
Special killer double trouble triple extra nicotine monster!
Отговор
в отговор на z_free #14

UniDirectional

Какво ти е UniDirectional на query-то? Възможно ли е да ти връща -1 заради него?

Отговор
в отговор на z_free #15

Re: killing in the name of

RTFS
Да погледнем в изворите (sources)
Имаме property RecordCount: Integer read GetRecordCount;
в TDataSet, където
function GetRecordCount: Integer; virtual;
function TDataSet.GetRecordCount: Longint;
begin
Result := -1;
end;
Т.е. ако GetRecordCount не е препокрита в наследниците, ще имаме -1

В твоя случай, обаче

TQuery = class(TDBDataSet)
TDBDataSet = class(TBDEDataSet)
TBDEDataSet = class(TDataSet)

function TBDEDataSet.GetRecordCount: Integer;
begin
CheckActive;
if (DbiGetExactRecordCount(FHandle, Result) <> DBIERR_NONE) and
(DbiGetRecordCount(FHandle, Result) <> DBIERR_NONE) then
Result := -1;
end;

Т.е. DbiGetExactRecordCount и DbiGetRecordCount ти връщат грешка.
Защо?
Ти трябва да си отговориш
Не казваш за каква база става въпрос и с какви драйвери се връзваш.

Отговор
в отговор на v_automation #16

Re: защо

probvai taka:
Query.First;
Query.Last;
i sega ve4e Query.RecordCount

Отговор
в отговор на v_automation #17

Re: защо

Не си съвсем прав. Сигурно има хора с опит, които веднага като видят такъв въпрос "защо RecordCount = -1", ще отговорят конкретно и компетентно.

Някои от отговорите са такива или с насочващи въпроси, по същество.

Това, че ти не си се сетил веднага за какво става дума или че не си разбрал въпроса, не ти дава право да отговаряш по този начин.

No offense...

---
...и аз пиша на кирилица!
Отговор