количество строк в таблице mysql

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

VladMgn
незнакомец
Сообщения: 8
Зарегистрирован: 02.12.2012 03:25:10

количество строк в таблице mysql

Сообщение VladMgn »

Приветствую !
Как новичек, нуждаюсь в помощи по работе lazarus с mysql:
как узнать количество строк в таблице mysql 5, с примером присвоения значения в переменную если можно;

lazarus 1.0.2 fpc 2.6.0 svn 39019 windows 7
бд на удаленном сервере
Аватара пользователя
Xenar
постоялец
Сообщения: 158
Зарегистрирован: 08.06.2011 12:54:07

Сообщение Xenar »

Код: Выделить всё

var 
i: Integer;
begin
SQLQuery1.First;
while not SQLQuery1.EOF do
  begin
   inc(i);
   SQLQuery1.Next; 
  end;
end;

Так устроит?
VladMgn
незнакомец
Сообщения: 8
Зарегистрирован: 02.12.2012 03:25:10

Сообщение VladMgn »

Xenar писал(а):Так устроит?


спасибо большое, а если база будет большая, надолго затянется перебор ?
Frolik
постоялец
Сообщения: 275
Зарегистрирован: 18.08.2011 11:52:32

Сообщение Frolik »

считать количество строк в базе перебором - это сурово.
используйте SELECT COUNT(*) AS row_count FROM table_name
VladMgn
незнакомец
Сообщения: 8
Зарегистрирован: 02.12.2012 03:25:10

Сообщение VladMgn »

Frolik писал(а):считать количество строк в базе перебором - это сурово.
используйте SELECT COUNT(*) AS row_count FROM table_name

как оно пишется в коде я не пойму как значение count(*) передать в лазарус ?
Аватара пользователя
amateur
энтузиаст
Сообщения: 552
Зарегистрирован: 03.08.2007 10:15:32

Сообщение amateur »

надолго затянется перебор ?
Disablecontrol + EnableControl (если подключены визуальные контролы). Скорость будет зависеть от кол-ва записей. Впринцыпе приемлима.

С помощью SQL проще и быстрее.

как оно пишется в коде я не пойму как значение count(*) передать в лазарус ?

вроде так :)

Код: Выделить всё

With SQLQuery1.SQL do  begin
  Clear;
  Add('SELECT COUNT(*) AS row_count FROM table_name');
end;
Аватара пользователя
Little_Roo
энтузиаст
Сообщения: 639
Зарегистрирован: 27.02.2009 18:56:36
Откуда: Санкт-Петербург

Сообщение Little_Roo »

VladMgn писал(а): я не пойму как значение count(*) передать в лазарус ?

Через SQL запрос :D ... Да, а какие компоненты доступа к БД используете? и используете ли ????

Опа... опередили с ответом :D
VladMgn
незнакомец
Сообщения: 8
Зарегистрирован: 02.12.2012 03:25:10

Сообщение VladMgn »

amateur писал(а):вроде так

спасибо, это сам запрос, а как значение запроса присвоить переменной в программе ? использую mysql50connection, sqltransacation, sqlquery и datasource
не пинайте, если вопрос глупый :oops:
типа что то
rows:= row_count;
Аватара пользователя
yeger
новенький
Сообщения: 49
Зарегистрирован: 17.03.2011 11:26:34

Сообщение yeger »

VladMgn, вам amateur подсказал сам запрос для SqlQuery, его выполняете. Результат будет хранится в "SQLQuery1.Fields.Fields[1]", прочитать его можно как любой тип, и присвоение будет выглядеть примерно так

Код: Выделить всё

if SQLQuery1.Active then SQLQuery1.Active:=false;//А вдруг предыдущий не закрыли
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Add('SELECT COUNT(*) AS row_count FROM table_name');
SQLQuery1.Open;//выполняем запрос
SQLQuery1.First;//курсор на первую запись, не важно что одна, для верности
rows := SQLQuery1.Fields.Fields[1].AsInteger;//читаем
VladMgn
незнакомец
Сообщения: 8
Зарегистрирован: 02.12.2012 03:25:10

Сообщение VladMgn »

Спасибо огромное!!!
Владимир
постоялец
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Сообщение Владимир »

yeger писал(а):if SQLQuery1.Active then SQLQuery1.Active:=false;//А вдруг предыдущий не закрыли
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Add('SELECT COUNT(*) AS row_count FROM table_name');
SQLQuery1.Open;//выполняем запрос
SQLQuery1.First;//курсор на первую запись, не важно что одна, для верности
rows := SQLQuery1.Fields.Fields[1].AsInteger;//читаем


Мои 5 копеек:

Код: Выделить всё

var
rows:Integer;
.........
SQLQuery1.SQL.Add('SELECT COUNT(field_name) AS row_count FROM table_name');//если указывать конкретное поле, то запрос должен выполняться быстрее (теоретически)
SQLQuery1.Open;//выполняем запрос
SQLQuery1.First;//курсор на первую запись, не важно что одна, для верности - СОГЛАСЕН
rows:=SQLQuery1.FieldByName('row_count').Value;//как вариант - query содержит результат запроса в переменной variant, не заботясь о его типе. И если переменная rows соответствует типу поля, то все Ок.
VladMgn
незнакомец
Сообщения: 8
Зарегистрирован: 02.12.2012 03:25:10

Сообщение VladMgn »

Владимир писал(а):/если указывать конкретное поле, то запрос должен выполняться быстрее (теоретически)
SQLQuery1.Open;//выполняем запрос

тоже интересный момент, спасибо!
v-t-l
энтузиаст
Сообщения: 744
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l »

Владимир писал(а):если указывать конкретное поле, то запрос должен выполняться быстрее (теоретически)

Как раз наоборот. Обычно, если нет условий WHERE, для выполнения запроса SELECT COUNT(*) sql-движку достаточно прочитать количество строк из служебной инфы таблицы, а если указать конкретное поле, то движку придется подсчитывать количество NOT NULL значений в этом поле.
Владимир
постоялец
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Сообщение Владимир »

v-t-l писал(а):Как раз наоборот.

Век живи...
VladMgn
незнакомец
Сообщения: 8
Зарегистрирован: 02.12.2012 03:25:10

Сообщение VladMgn »

:?: теперь другая проблема, не хочет в базе изменения сохранять, пример:

Код: Выделить всё

begin
 try
  dbform.SQLQuery1.Active:=true;
  dbform.SQLQuery1.SQL.Clear;
  dbform.SQLQuery1.sql.add('SELECT oborud from  ob_');
  dbform.SQLQuery1.Open;;
 except
  ShowMessage(' Ошибка при выполнении SQL запроса.');
  exit;
  end;
 dbform.SQLQuery1.First;
 oborudform.stringgrid1.Row:=1;
 dbform.SQLQuery1.Edit;
 dbform.SQLQuery1.FieldByName('oborud').AsString:= oborudform.stringgrid1.Cells[1,oborudform.stringgrid1.Row];
 dbform.SQLQuery1.Post;
 dbform.SQLQuery1.ApplyUpdates;
 dbform.SQLTransaction1.CommitRetaining;
 dbform.SQLQuery1.Active:=false;
 dbform.SqlQuery1.Close;
 end;                                       


где можно посмотреть лог работы mysql с лазарусом, может в нем что видно будет ?
Ответить