добавление записей в mysql5

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

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

добавление записей в mysql5

Сообщение nusya » 06.01.2009 16:20:25

Используются такие компоненты: Datasource1: TDatasource; MySQL50Connection1: TMySQL50Connection; SQLQuery1: TSQLQuery;
SQLTransaction1: TSQLTransaction;

пытаюсь добавить в таблицу запись
в первом способе использую SQLQuery1.SQL.Append('select * from services'); SQLQuery1.Open; SQLQuery1.Insert; SQLQuery1.FieldValues['aaa']:=111; SQLQuery1.Post;
во втором способе использую SQLQuery1.SQL.Clear; SQLQuery1.SQL.Append('insert into services (aaa) values (111)'); SQLQuery1.ExecSQL;

в общем никакой реакции со стороны mysql5, хотя такие команды как 'create database test1' и 'create table services...' работают
не пойму в чем дело.
nusya
новенький
 
Сообщения: 19
Зарегистрирован: 15.09.2008 12:58:15

Re: добавление записей в mysql5

Сообщение GrayEddy » 06.01.2009 16:26:54

Для первого способа добавь пару строк
Код: Выделить всё
...
SQLQuery1.Close;
SQLQuery1.Open;
GrayEddy
постоялец
 
Сообщения: 375
Зарегистрирован: 06.05.2005 09:37:56

Re: добавление записей в mysql5

Сообщение nusya » 06.01.2009 16:33:04

GrayEddy писал(а):Для первого способа добавь пару строк
Код: Выделить всё
...
SQLQuery1.Close;
SQLQuery1.Open;


Причем тут Close, у меня и так изначально набор данных закрыт
nusya
новенький
 
Сообщения: 19
Зарегистрирован: 15.09.2008 12:58:15

Re: добавление записей в mysql5

Сообщение GrayEddy » 06.01.2009 16:37:18

Добавить в конец первого способа, а не в начало. :)
Чтобы увидеть, что вставка записи успешно завершена, надо переоткрыть запрос (закрыть и открыть).
GrayEddy
постоялец
 
Сообщения: 375
Зарегистрирован: 06.05.2005 09:37:56

Re: добавление записей в mysql5

Сообщение nusya » 06.01.2009 16:42:58

GrayEddy писал(а):Добавить в конец первого способа, а не в начало. :)


а при чем тут это, ты хочешь сказать, что все post будут срабатывать только после закрытия таблицы.
а если у меня их бедет пару десятков тысяч.
в общем не работает этот способ.

а какая разница как я смотрю что вставка записи завершена. Например мне достаточно посмотреть в каталог моей базы данных и что я вижу там после вставки. А ничего. Все как раньше. Файл db.opt с настройками и файлик services.frm, с описанием полей моей таблицы, и все. И никакие Close и закрытие Connection не изменяют содержимое этого каталога, а следовательно никакой вставки в итоге не произошло.
nusya
новенький
 
Сообщения: 19
Зарегистрирован: 15.09.2008 12:58:15

Re: добавление записей в mysql5

Сообщение GrayEddy » 06.01.2009 16:48:19

> а если у меня их бедет пару десятков тысяч
Почему бы и нет? Если кешируешь записи, то да. Тогда SQLQuery1.ApplyUpdates физически занесет в БД.
Вот реальный пример.
Код: Выделить всё
for i := 0 to cnt - 1 do begin
    dmmo.queryTechDetails.append;
    dmmo.queryTechDetails.fieldbyname('dtlID').asinteger := i + 1;
    dmmo.queryTechDetails.fieldbyname('dtlCatID').asinteger := dmmo.queryDetails.fieldbyname('detail_id').asinteger;
    dmmo.queryTechDetails.fieldbyname('dtlName').asstring := trim(dmmo.queryDetails.fieldbyname('detail_name').asstring);
    dmmo.queryTechDetails.fieldbyname('dtlCatalogNum').value := dmmo.queryDetails.fieldbyname('detail_no').value;
    dmmo.queryTechDetails.fieldbyname('dtlPosNum').asinteger := dmmo.queryDetails.fieldbyname('detail_pos').asinteger;
    dmmo.queryTechDetails.fieldbyname('dtlMapNum').asinteger := dmmo.queryDetails.fieldbyname('map').asinteger;
    dmmo.queryTechDetails.fieldbyname('dtlImageNum').asinteger := dmmo.queryDetails.fieldbyname('detail_picture').asinteger;
    //dmmo.queryTechDetails.fieldbyname('dtlPrise').asfloat := dmmo.queryDetails.fieldbyname('detail_price').asfloat;
    if (i mod 1000 = 0) then begin
      dmmo.queryTechDetails.applyupdates;
      inc(count);
      tlabel1.caption := format('Проходов: %d', [count]);
      application.processmessages;
    end;
    dmmo.queryDetails.next;
  end;
  dmmo.queryTechDetails.applyupdates;
  dmmo.queryTechDetails.transactionwrite.commit;
  dmmo.queryTechDetails.close;
GrayEddy
постоялец
 
Сообщения: 375
Зарегистрирован: 06.05.2005 09:37:56

добавление записей в mysql5

Сообщение nusya » 06.01.2009 18:20:20

в общем надоело мучаться, высылаю пример, что не так??????
У вас нет необходимых прав для просмотра вложений в этом сообщении.
nusya
новенький
 
Сообщения: 19
Зарегистрирован: 15.09.2008 12:58:15

Re: добавление записей в mysql5

Сообщение GrayEddy » 07.01.2009 00:10:20

Переписанный вариант, самый простой
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
   SQLQuery1.Append; // добавим раз
   SQLQuery1.FieldByName('xkey').AsInteger := 123;
   SQLQuery1.Append;  // два
   SQLQuery1.FieldByName('xkey').AsInteger := 124;
   SQLQuery1.Append;  // три
   SQLQuery1.FieldByName('xkey').AsInteger := 125;

   SQLQuery1.ApplyUpdates; // из буффера физически заносим в БД.
   
   // Проверка, что мы действительно добавили записи
  SQLQuery1.Close;
  SQLQuery1.SQL.Clear;
  SQLQuery1.SQL.Add('select * from services');
  SQLQuery1.Open;
  while not SQLQuery1.Eof do begin
    ShowMessage('xkey: ' + IntToStr(SQLQuery1.FieldByName('xkey').AsInteger));
    SQLQuery1.Next;
  end;
end;


PS. Поле id_ заполнять не нужно - оно само растет автоматом (раз автоинкремент).
GrayEddy
постоялец
 
Сообщения: 375
Зарегистрирован: 06.05.2005 09:37:56

Re: добавление записей в mysql5

Сообщение nusya » 07.01.2009 02:37:56

ок. все получилось. Но есть одно но.
как я уже говорил, в каталоге, где должна лежать база есть файл db.opt с настройками и файлик services.frm, с описанием полей моей таблицы. После добавления записей должен получиться файлик services с расширением MYD, где и будут храниться добавленные данные. Поправте меня если это не так.

Я сначало думал, что, может он в памяти хранит данные и не скидывает их, но перезапуск службы mysql ничего не дал, данные так и остались невредимы, значит где-то они хранять в файле. Вопрос где????

и еще одно, при использовании SQLQuery1.RecordCount, возвращается число 10, хотя в таблице более 400 тыс. записей.
nusya
новенький
 
Сообщения: 19
Зарегистрирован: 15.09.2008 12:58:15

Re: добавление записей в mysql5

Сообщение Vadim » 07.01.2009 09:06:14

nusya писал(а):Я сначало думал, что, может он в памяти хранит данные и не скидывает их, но перезапуск службы mysql ничего не дал, данные так и остались невредимы, значит где-то они хранять в файле.Вопрос где?

Логически отсюда следует, что не там, где Вы смотрите. :) Поищите обычным поиском на предмет services.*.
nusya писал(а):при использовании SQLQuery1.RecordCount, возвращается число 10, хотя в таблице более 400 тыс. записей.

В SQLQuery у Вас ровно столько записей, сколько Вы выбрали в запросе согласное его условию. К количеству записей в таблице это не имеет никакого отношения.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: добавление записей в mysql5

Сообщение nusya » 07.01.2009 13:39:33

Vadim писал(а):Логически отсюда следует, что не там, где Вы смотрите. :) Поищите обычным поиском на предмет services.*.

ребят, ну не надо давать тупые советы, я не первый день за компьютером, я по всему диску искал, нет таких файлов, относящихся к mysql. а потом, почему этот файл должен находиться в другом каталоге, относительно описания таблицы. По крайне мере я не нашел в настройках mysql такой настройки (может конечно что-то пропустил). Сегодня попробую отследить обращения к файлам, может найду откуда информация берется.
Vadim писал(а):В SQLQuery у Вас ровно столько записей, сколько Вы выбрали в запросе согласное его условию. К количеству записей в таблице это не имеет никакого отношения.

select * from services - вот мой запрос. думаю что он охватывает все записи. Никаких лимитов я не использовал.
nusya
новенький
 
Сообщения: 19
Зарегистрирован: 15.09.2008 12:58:15

Re: добавление записей в mysql5

Сообщение GrayEddy » 07.01.2009 15:42:19

nusya писал(а):и еще одно, при использовании SQLQuery1.RecordCount, возвращается число 10, хотя в таблице более 400 тыс. записей.

Имеется в виду таблица Services? Если да, то обращение идет, видимо, к таблице, созданной вами.
400 000 записей? Это уже другая БД (и другой каталог), которая содержит таблицу с таким же именем Services.

Можно поискать services.* и отсортировать по дате и времени его последнего изменения. Заодно и увидеть, где что лежит в каком каталоге.
GrayEddy
постоялец
 
Сообщения: 375
Зарегистрирован: 06.05.2005 09:37:56

Re: добавление записей в mysql5

Сообщение Vadim » 07.01.2009 16:37:09

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

Пока что этого совершенно не заметно. :)
Судя по Вашим замечаниям о тексте запроса и сколько записей должно быть в запросе - вы говорите о двух разных таблицах. Так что вместо игнорирования "тупых" советов лучше займитесь поиском к какой именно базе Вы обращаетесь. Иначе для Вас все советы будут "тупые"... :)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: добавление записей в mysql5

Сообщение wavebvg » 07.01.2009 18:29:50

Вот как я примерно это делаю (был бы рад замечаниям и критике :-) )
О том, что делают и чем являются необъявленные процедуры и компоненты несложно догадаться
Код: Выделить всё
type
    tMySQLdata = class // Получение и сохранение данных в базу
    private
           MySQLConnection : TMySQL50Connection;
           SQLQuery : TSQLQuery;
           SQLTransaction : TSQLTransaction;
           Datasource : TDatasource;
           table:string;
    public
          constructor Create(host_,user_,pass_,shema_,table_:string);
          constructor Destroy;
          procedure setT1Dreal(data:T1DReal;params:Tparamstp);
    end;

constructor tMySQLdata.Create(host_,user_,pass_,shema_,table_:string);
begin
     inherited Create;
     {Создаём компоненты для установки соединения}
     MySQLConnection:=TMySQL50Connection.Create(NIL);
     SQLQuery:=TSQLQuery.Create(NIL);
     SQLTransaction:=TSQLTransaction.Create(NIL);
     Datasource:=TDatasource.Create(NIL);

     {Настраиваем порядок подключения}
     Datasource.DataSet:=SQLQuery;
     SQLQuery.DataBase:=MySQLConnection;
     SQLQuery.TransAction:=SQLTransaction;
     SQLTransaction.DataBase:=MySQLConnection;

     table:=table_;

     {Настраиваем соединение}
     With MySQLConnection do
     Begin
          try
             HostName:=host_;
             DatabaseName:=shema_;
             UserName:=user_;
             Password:=pass_;
             SQLQuery.SQL.Clear;
             Connected:=true;
          except
          end;
     End;
end;

procedure tMySQLdata.setT1Dreal(data:T1DReal;params:Tparamstp);
var sql:string;
begin
     sql:='INSERT INTO '+table+'('+params.asstring(', ')+') VALUE ('+
     T1Drealasstring(data,', ')+')';
     SQLQuery.SQL.Clear;
     writeln(sql);
     SQLQuery.SQL.Add(sql);
     writeln('connected=',MySQLConnection.Connected);
     try
     SQLQuery.ExecSQL;
     except
     end;
end;
wavebvg
постоялец
 
Сообщения: 354
Зарегистрирован: 28.02.2008 04:57:35

Re: добавление записей в mysql5

Сообщение GrayEddy » 07.01.2009 19:14:37

> wavebvg
Как вы заюзаете свойство DataSource (скажем, для связки с гридом), если оно приватное?
GrayEddy
постоялец
 
Сообщения: 375
Зарегистрирован: 06.05.2005 09:37:56

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 42

Рейтинг@Mail.ru