добавление записей в mysql5
Модератор: Модераторы
добавление записей в mysql5
Используются такие компоненты: 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...' работают
не пойму в чем дело.
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...' работают
не пойму в чем дело.
Для первого способа добавь пару строк
Код: Выделить всё
...
SQLQuery1.Close;
SQLQuery1.Open;GrayEddy писал(а):Для первого способа добавь пару строкКод: Выделить всё
...
SQLQuery1.Close;
SQLQuery1.Open;
Причем тут Close, у меня и так изначально набор данных закрыт
Добавить в конец первого способа, а не в начало. 
Чтобы увидеть, что вставка записи успешно завершена, надо переоткрыть запрос (закрыть и открыть).
Чтобы увидеть, что вставка записи успешно завершена, надо переоткрыть запрос (закрыть и открыть).
GrayEddy писал(а):Добавить в конец первого способа, а не в начало.
а при чем тут это, ты хочешь сказать, что все post будут срабатывать только после закрытия таблицы.
а если у меня их бедет пару десятков тысяч.
в общем не работает этот способ.
а какая разница как я смотрю что вставка записи завершена. Например мне достаточно посмотреть в каталог моей базы данных и что я вижу там после вставки. А ничего. Все как раньше. Файл db.opt с настройками и файлик services.frm, с описанием полей моей таблицы, и все. И никакие Close и закрытие Connection не изменяют содержимое этого каталога, а следовательно никакой вставки в итоге не произошло.
> а если у меня их бедет пару десятков тысяч
Почему бы и нет? Если кешируешь записи, то да. Тогда SQLQuery1.ApplyUpdates физически занесет в БД.
Вот реальный пример.
Почему бы и нет? Если кешируешь записи, то да. Тогда 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;в общем надоело мучаться, высылаю пример, что не так??????
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Переписанный вариант, самый простой
PS. Поле id_ заполнять не нужно - оно само растет автоматом (раз автоинкремент).
Код: Выделить всё
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_ заполнять не нужно - оно само растет автоматом (раз автоинкремент).
ок. все получилось. Но есть одно но.
как я уже говорил, в каталоге, где должна лежать база есть файл db.opt с настройками и файлик services.frm, с описанием полей моей таблицы. После добавления записей должен получиться файлик services с расширением MYD, где и будут храниться добавленные данные. Поправте меня если это не так.
Я сначало думал, что, может он в памяти хранит данные и не скидывает их, но перезапуск службы mysql ничего не дал, данные так и остались невредимы, значит где-то они хранять в файле. Вопрос где????
и еще одно, при использовании SQLQuery1.RecordCount, возвращается число 10, хотя в таблице более 400 тыс. записей.
как я уже говорил, в каталоге, где должна лежать база есть файл db.opt с настройками и файлик services.frm, с описанием полей моей таблицы. После добавления записей должен получиться файлик services с расширением MYD, где и будут храниться добавленные данные. Поправте меня если это не так.
Я сначало думал, что, может он в памяти хранит данные и не скидывает их, но перезапуск службы mysql ничего не дал, данные так и остались невредимы, значит где-то они хранять в файле. Вопрос где????
и еще одно, при использовании SQLQuery1.RecordCount, возвращается число 10, хотя в таблице более 400 тыс. записей.
nusya писал(а):Я сначало думал, что, может он в памяти хранит данные и не скидывает их, но перезапуск службы mysql ничего не дал, данные так и остались невредимы, значит где-то они хранять в файле.Вопрос где?
Логически отсюда следует, что не там, где Вы смотрите.
nusya писал(а):при использовании SQLQuery1.RecordCount, возвращается число 10, хотя в таблице более 400 тыс. записей.
В SQLQuery у Вас ровно столько записей, сколько Вы выбрали в запросе согласное его условию. К количеству записей в таблице это не имеет никакого отношения.
Vadim писал(а):Логически отсюда следует, что не там, где Вы смотрите.Поищите обычным поиском на предмет services.*.
ребят, ну не надо давать тупые советы, я не первый день за компьютером, я по всему диску искал, нет таких файлов, относящихся к mysql. а потом, почему этот файл должен находиться в другом каталоге, относительно описания таблицы. По крайне мере я не нашел в настройках mysql такой настройки (может конечно что-то пропустил). Сегодня попробую отследить обращения к файлам, может найду откуда информация берется.
Vadim писал(а):В SQLQuery у Вас ровно столько записей, сколько Вы выбрали в запросе согласное его условию. К количеству записей в таблице это не имеет никакого отношения.
select * from services - вот мой запрос. думаю что он охватывает все записи. Никаких лимитов я не использовал.
nusya писал(а):и еще одно, при использовании SQLQuery1.RecordCount, возвращается число 10, хотя в таблице более 400 тыс. записей.
Имеется в виду таблица Services? Если да, то обращение идет, видимо, к таблице, созданной вами.
400 000 записей? Это уже другая БД (и другой каталог), которая содержит таблицу с таким же именем Services.
Можно поискать services.* и отсортировать по дате и времени его последнего изменения. Заодно и увидеть, где что лежит в каком каталоге.
nusya писал(а):ребят, ну не надо давать тупые советы, я не первый день за компьютером,
Пока что этого совершенно не заметно.
Судя по Вашим замечаниям о тексте запроса и сколько записей должно быть в запросе - вы говорите о двух разных таблицах. Так что вместо игнорирования "тупых" советов лучше займитесь поиском к какой именно базе Вы обращаетесь. Иначе для Вас все советы будут "тупые"...
Вот как я примерно это делаю (был бы рад замечаниям и критике
)
О том, что делают и чем являются необъявленные процедуры и компоненты несложно догадаться
О том, что делают и чем являются необъявленные процедуры и компоненты несложно догадаться
Код: Выделить всё
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
Как вы заюзаете свойство DataSource (скажем, для связки с гридом), если оно приватное?
Как вы заюзаете свойство DataSource (скажем, для связки с гридом), если оно приватное?
