Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2014.09.21;
Скачать: CL | DM;

Вниз

Как узнать количество записей в таблице?   Найти похожие ветки 

 
Novicer   (2014-02-11 13:04) [0]

Пробовал select count(*) frome mytable результата нет :( Мне нужно в ShowMessage показать сколько строк в таблице, а куда сохраняет результат запрос непонятно... Погуглив нашел всюду один пример в виде запроса, в чем сидит результ тайна :)


 
macrodens ©   (2014-02-11 13:05) [1]

Запрос через что делаешь?


 
Германн ©   (2014-02-11 13:09) [2]


> куда сохраняет результат запрос непонятно

Сюда http://docwiki.embarcadero.com/Libraries/XE2/en/Data.DB.TDataSet.Fields


 
macrodens ©   (2014-02-11 13:09) [3]

самый простой пример:

 Query.SQL.Text := "select count(*) as Cnt from mytable";
 Query.Open;
 showmessage(Query.FieldByName("Cnt").asstring);


 
Novicer   (2014-02-11 13:11) [4]

Запрос через IbQuery(ibx) :) Спасибо за пример!


 
Ega23 ©   (2014-02-11 13:16) [5]

var
 ds: TIBSQL;
begin
 ds := TIBSQL.Create(nil);
 try
   ds.Connection := ...;
   ds.Transaction := ....;
   ds.SQL.Text := "select count(*) from mytable";
   ds.Open;
   ShowMessage(ds.Fields[0].AsString);
 finally
   ds.Free;
 end;
end;


 
Novicer   (2014-02-11 13:20) [6]

ShowMessage(IntToStr(IbQuery1.DataSource.DataSet.RecordCount)) приводит к ошибке, а какие были на него надежды... :( Хотел посчитать строки возвращаемые любым запросом...


 
Ega23 ©   (2014-02-11 13:23) [7]

IbQuery1.DataSource.DataSet.RecordCount

Ты в этом уверен? Может быть просто
IbQuery1.RecordCount  ?


 
Novicer   (2014-02-11 13:24) [8]

Не может такого быть чтобы где-то не хранилось количество строк возвращаемых запросом! Только вот я не знаю где... :(


 
Inovet ©   (2014-02-11 13:24) [9]

> [5] Ega23 ©   (11.02.14 13:16)
> ds.Fields[0]

Вот это для определения количества записей даже по какому-то критерию — предпочтительней, имхо, и достаточно безопасно, потому что заранее известно, что по логике в результате кроме 1 единственного поля и 1 единственной записи ничего нет. А вообще при обращении по номеру поля можно накосячить, при последуюющем изменении запроса.


 
Inovet ©   (2014-02-11 13:25) [10]

> [8] Novicer   (11.02.14 13:24)
> количество строк возвращаемых запросом

Оно заранее неизвестно вообще-то. Читай справку про RecordCount.


 
Novicer   (2014-02-11 13:26) [11]

Просто квери.рекордкаунт возвращает бредовую 14, в то время когда в гриде 5 тыщ записей :(


 
Inovet ©   (2014-02-11 13:28) [12]

> [11] Novicer   (11.02.14 13:26)
> в гриде 5 тыщ

В гриде нет записей


 
Smile   (2014-02-11 13:30) [13]

RecordCount
:)


 
Novicer   (2014-02-11 13:34) [14]

Отображаются записи в гриде, а то что они в датасете все знают, но удобнее говорить в гриде, потому как видишь их там :) прения по этому поводу для ворчунов ;) попытка узнать рекордкаунт датасета тоже почему-то провалилась с месагой про ошибку :(


 
macrodens ©   (2014-02-11 13:37) [15]

по поводу RecorCount внимательнее почитай Ega23 ©   (11.02.14 13:23) [7]


 
Smile   (2014-02-11 13:37) [16]

Читай до ... (полного понимания)
> Ega23 ©   (11.02.14 13:23) [7]
:)


 
Ega23 ©   (2014-02-11 13:37) [17]


> Не может такого быть чтобы где-то не хранилось количество
> строк возвращаемых запросом! Только вот я не знаю где...
>  :(


Это RecordCount


 
Ega23 ©   (2014-02-11 13:40) [18]


> Оно заранее неизвестно вообще-то. Читай справку про RecordCount.


Я уже подзабыл. Но по-моему, это RecNo не определено. Точнее - зависит от конкретной реализации TDataSet. А вот RecordCount должно быть определённым.

Хотя тут от курсора тоже может зависеть... Но, ИМХО, не для случая с IBQuery


 
Ega23 ©   (2014-02-11 13:42) [19]


> А вообще при обращении по номеру поля можно накосячить,
> при последуюющем изменении запроса.


С одной стороны - да. С другой на FieldByName при массовых операциях оверхед есть.
Но в 99.999% - таки да, FieldByName, кроме случаев получения строго одной записи.


 
RWolf ©   (2014-02-11 13:44) [20]


> Ega23 ©   (11.02.14 13:37) [17]
> > Не может такого быть чтобы где-то не хранилось количество
> > строк возвращаемых запросом! Только вот я не знаю где.
> >  :(
> Это RecordCount

только не возвращаемых, а возвращённых на текущий момент.


 
clickmaker ©   (2014-02-11 13:45) [21]

> на FieldByName при массовых операциях оверхед есть

Field := FieldByName("Name");
for ...
 Val := Field.AsString;
end;


 
Novicer   (2014-02-11 13:46) [22]

РекордКаунт неверно считает для квери, а для датасета вобще приводит к ошибке выполнения... :(


 
Inovet ©   (2014-02-11 13:51) [23]

> [19] Ega23 ©   (11.02.14 13:42)
> С другой на FieldByName при массовых операциях оверхед есть

Ну оверхед при массовой обработке придётся обойти разовым сопоставлением FieldByName и индексов в переменных. А так лучше бы создать поля в дизайнтайм — по крайней мере при изменении запроса будет более осмысленная ошибка.


 
Inovet ©   (2014-02-11 13:53) [24]

> [22] Novicer   (11.02.14 13:46)
> РекордКаунт неверно считает для квери

Ты ни ответы ни справку не читаешь?


 
Ega23 ©   (2014-02-11 13:55) [25]


> РекордКаунт неверно считает для квери, а для датасета вобще
> приводит к ошибке выполнения... :(


У меня всё работает. Наверное, я - идиот.


 
Ega23 ©   (2014-02-11 13:56) [26]


> clickmaker ©   (11.02.14 13:45) [21]


Да понятно оно всё. Обойти всегда можно.


 
Inovet ©   (2014-02-11 13:58) [27]

> [26] Ega23 ©   (11.02.14 13:56)
> Да понятно оно всё. Обойти всегда можно.

Ну так это автору советы.


 
Novicer   (2014-02-11 14:05) [28]

Ну и фиг с ним с рекордкаунтом этим, будет селект каунт... :) тоже неплохо считает...


 
Anatoly Podgoretsky ©   (2014-02-11 14:06) [29]

Ega23 ©   (11.02.14 13:55) [25]

> Наверное, я - идиот

Наверно


 
macrodens ©   (2014-02-11 14:10) [30]

ага особенно неплохо select count(*) считает в таблицах с большим количеством записей и полей... (я не к тому, что он не сосчитает, а ко времени на этот запрос)


 
Ega23 ©   (2014-02-11 14:12) [31]


> ага особенно неплохо select count(*) считает в таблицах
> с большим количеством записей и полей... (я не к тому, что
> он не сосчитает, а ко времени на этот запрос)


Это только в вашем б-гомерзском firebird, да и то на первом обращении.


 
Inovet ©   (2014-02-11 14:21) [32]

> [28] Novicer   (11.02.14 14:05)
> селект каунт... :) тоже неплохо считает...

Что значит «тоже неполхо». Он по-другому считает, не так как рекордсет. Почувствуй разницу сделав

IbQuery1.Last;
IbQuery1.RecordCount;
и
Запросом с count(*)


 
Ega23 ©   (2014-02-11 14:29) [33]


> IbQuery1.Last;
> IbQuery1.RecordCount;


О, точно. Last надо вызвать.


 
Германн ©   (2014-02-11 14:49) [34]


> Novicer   (11.02.14 13:46) [22]
>
> РекордКаунт неверно считает для квери, а для датасета вобще
> приводит к ошибке выполнения... :(

Да и вообще, что Делфи, что Си, что SQL жутко глючные заразы. Сплошные ошибки от них. Ничего правильно посчитать не могут.


 
asail ©   (2014-02-11 16:27) [35]


> Ega23 ©   (11.02.14 14:29) [33]
>
> > IbQuery1.Last;
> > IbQuery1.RecordCount;
>
>
> О, точно. Last надо вызвать.

Не. Согласно феньшую, лучше FetchAll вызывать...


 
Inovet ©   (2014-02-11 16:36) [36]

> [35] asail ©   (11.02.14 16:27)
> Согласно феньшую, лучше FetchAll вызывать

То по феншую, а автору для понимания как раз Last поможет.


 
Ega23 ©   (2014-02-11 16:43) [37]


> Не. Согласно феньшую, лучше FetchAll вызывать...


Я уже тыщщу лет (шесть) этим не пользовался, сейчас только ORM, а там пофигу.


 
asail ©   (2014-02-11 16:57) [38]


> То по феншую, а автору для понимания как раз Last поможет.

Автору для понимания, кроме справки и подходящей литературы, ничто и никто не поможет... По себе знаю.


 
Novicer   (2014-02-12 09:49) [39]

>asail Литературу прикупил, бум читать... А вот от справки пока толку мало :( Гугл рулит! ;) и на форумах еще отзывчивые люди не перевелись, за что им Огромное спасибо!!! :)


 
clickmaker ©   (2014-02-12 10:04) [40]

> Не. Согласно феньшую, лучше FetchAll вызывать...

ну да. Вот сишники до сих пор, чтобы длину строки узнать, вынуждены бежать до закрывающего нуля


 
asail ©   (2014-02-12 18:58) [41]


> clickmaker ©   (12.02.14 10:04) [40]
> > Не. Согласно феньшую, лучше FetchAll вызывать...
>
> ну да. Вот сишники до сих пор, чтобы длину строки узнать,
>  вынуждены бежать до закрывающего нуля

Секундочку! Речь шла о лучше относительно Last, а не SELECT COUNT(*)... Так что, при чем тут бегающие куда-то сишники не понятно...


 
asail ©   (2014-02-12 19:02) [42]


>
> Novicer   (12.02.14 09:49) [39]
> >asail Литературу прикупил, бум читать... А вот от справки
> пока толку мало

То что литературу прикупил, это хорошо. А про справку - зря. В гугле, конечно, можно много чего нагуглить, но, образования ради, советую про каждый используемый метод или свойство VCL прочитать в справке. Просто, чтоб усвоить че это и зачем и в следующий раз в гугл не бегать...


 
Novicer   (2014-02-12 23:16) [43]

Справка в Дельфи 2010 значительно хуже чем 7-ой версии. Результатов ворох, а по делу мало :( и с примерами беда... Вобще справкой перестал пользоватся.


 
Dennis I. Komarov ©   (2014-02-12 23:21) [44]

А для чего нудно знать количество записей в таблице?


 
Novicer   (2014-02-13 00:00) [45]

Нудно ничего не знать, значительно веселее знать все ;)


 
Dennis I. Komarov ©   (2014-02-13 09:48) [46]

Ну, как знаешь...



Страницы: 1 2 вся ветка

Текущий архив: 2014.09.21;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.01 c
2-1382127402
SergP
2013-10-19 00:16
2014.09.21
Вопрос по синхронизации потоков.


2-1382012973
Андрей Темкин
2013-10-17 16:29
2014.09.21
Сколько строк можно загрузить в TStringList?


15-1392449558
Мистер Хэ
2014-02-15 11:32
2014.09.21
Какой тип символов в ShortString?


15-1392553681
Разведка
2014-02-16 16:28
2014.09.21
как свернуть все процедуры и функции


15-1392038991
Мистер Хэ
2014-02-10 17:29
2014.09.21
_DynArrayAddRef/_NewUnicodeString/_NewAnsiString/_NewWideString