Форум: "Прочее";
Текущий архив: 2014.09.21;
Скачать: [xml.tar.bz2];
ВнизКак узнать количество записей в таблице? Найти похожие ветки
← →
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 вызывать...
ну да. Вот сишники до сих пор, чтобы длину строки узнать, вынуждены бежать до закрывающего нуля
Страницы: 1 2 вся ветка
Форум: "Прочее";
Текущий архив: 2014.09.21;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.003 c