![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Добавление в базу
Scot Storch © (2009-02-27 11:07:00)Необходимо добавить запись в таблицу БД и установить ее текущей. Пока что cделал что-то типа:
Q.SQL.Text := Format('Insert into Orders (link_id) values (%d)', [link_id]);
Q.ExecSQL;
Q.Last;
Но тут возник вопрос, если с базой буде работать одновременно несколько десятков пользователей, какова вероятность нарваться не на "свою" записть (Q.Last).
Или же лучше делать добавление через через TTable.
try
Table.Append;
Table.FieldByName('link_id').AsInteger := link_id;
Table.Post;
except
Table.Cancel;
end;
(2009-03-17 16:08:00) [1]Удалено модератором
clickmaker (2009-02-27 16:48:00) [2]интересно: выполняется cmp_QueryOther_, а поле получается из cmp_Query -)
Медвежонок Пятачок (2009-02-27 16:45:00) [3]ну значит я еще успел с [11]
Ega23 (2009-02-27 16:42:00) [4]
> Ну а ежели там не mssql?
А ежели он? Тем более, что у автора до боли знакомоеselect @@identityв [17] проскочило...
Медвежонок Пятачок (2009-02-27 16:38:00) [5]для identity-поля на MSSQL любой версии начиная с 7.0 (с более ранними просто не работал).
Ну а ежели там не mssql?
MsGuns (2009-02-27 15:50:00) [6]Замечание:
1) Текст запроса я бы писал явно без всяких format, во-первых много читабельнее, во вторых удобнее при отладке собственно запроса через оболочку (SQL explorer например)
2) Вместо динамических запросов предпочтительнее пользоваться параметрическими
Scot Storch (2009-02-27 14:06:00) [7]Всем спасибо за советы, сделал с использованием identity-поля. Вот собственно код:
Если есть возможность его оптимизировать или я что-то не учет, дайте еще советы.
Result := -1;
if ConnectionStatus = csConnected then
try
cmp_Database.StartTransaction;
try
ExecSQL(cmp_QueryOther_, Format('INSERT INTO Itemo (link_id, group_id) VALUES (%d, %d); select @@identity',
[LinkId, const_def_group_id]));
Id := cmp_Query.Fields[0].AsInteger;
if FindById(Id) > 0 then
Result := Id;
cmp_Database.Commit;
except
on E: Exception do
begin
cmp_Database.Rollback;
raise Exception.CreateResFmt(@const_msg_ErrorAddGood, [E.Message]);
end;
end;
except
on E: Exception do
LastMsgError := E.Message;
end
else
LastMsgError := LoadResString(@const_msg_ConnectionNotExists);
Ega23 (2009-02-27 13:29:00) [8]
> оно спорное, если компоненты доступа продвинутые и могут
> вернуть значение порожденное на сервере.
Я обычным банальным TQuery через миллион раз оплёванное BDE совершенно спокойно верну значение вставленной записи для identity-поля на MSSQL любой версии начиная с 7.0 (с более ранними просто не работал).
Медвежонок Пятачок (2009-02-27 13:24:00) [9]а и продвинутые часто так делают, например фибсы.
прописываешь полю имя генератора, и при вставке некст значение генератора незаметно тянется на клиента перед инсертом
Медвежонок Пятачок (2009-02-27 13:22:00) [10]оно спорное, если компоненты доступа продвинутые и могут вернуть значение порожденное на сервере.
Ega23 (2009-02-27 13:18:00) [11]
> Проще получить ID не добавленной, а ID для добавляемой записи.
Это очень спорное утверждение. Очень.
Плохиш (2009-02-27 13:03:00) [12]
> А какой?
любой
Медвежонок Пятачок (2009-02-27 13:02:00) [13]А как получить ID добавленной записи? (имеется ввиду после выполнения SQL-запроса)
Проще получить ID не добавленной, а ID для добавляемой записи.
Как именно - смотри свой триггер на сервере
Scot Storch (2009-02-27 13:00:00) [14]
> С чего ты взял, что она будет последней?
А какой?
Johnmen (2009-02-27 12:29:00) [15]
> > > Scot Storch (27.02.09 11:07) > Q.Last;А это для чего?
> Для того чтобы установить добавленную запись текущей в таблице,
> тут ошибся - не Q.Last а Table.Last
С чего ты взял, что она будет последней?
Ega23 (2009-02-27 11:56:00) [16]
> DBISAM
Я не знаю, что это такое. Могу посоветовать RTFM или специализированные форумы. В мануале скорее всего что-то такое есть. Ищи про последовательности (sequence).
Но это половина беды. Вторая - какого типа у тебя ID и каким образом генерируется следующее значение. Это может быть простейшийselect IsNull(Max(ID) + 1, 1), это может быть последовательность, это может быть какой-нибудь "счетчик" и т.д.
Scot Storch (2009-02-27 11:37:00) [17]DBISAM
Ega23 (2009-02-27 11:32:00) [18]
> А как получить ID добавленной записи? (имеется ввиду после
> выполнения SQL-запроса)
Для особо одарённых: это сильно зависит от СУБД и структуры таблицы.
Для MSSQL - одни подходы, для Postgres - другие, для Oracle - третьи и т.д.
Scot Storch (2009-02-27 11:26:00) [19]
> > Scot Storch (27.02.09 11:07) > Q.Last;А это для чего?
Для того чтобы установить добавленную запись текущей в таблице, тут ошибся - не Q.Last а Table.Last
Johnmen (2009-02-27 11:23:00) [20]
> Scot Storch (27.02.09 11:07)
> Q.Last;
А это для чего?