Форум: "Начинающим";
Текущий архив: 2009.04.26;
Скачать: [xml.tar.bz2];
ВнизДобавление в базу Найти похожие ветки
← →
Scot Storch (2009-02-27 11:07) [0]Необходимо добавить запись в таблицу БД и установить ее текущей. Пока что 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;
← →
Ega23 © (2009-02-27 11:13) [1]Нужно одной транзакцией вставить запись в БД и получить её ID. Потом обновить свой НД и спозиционироваться в нём на этот ID.
Как конкретно это делать - уже зависит от СУБД, с которой ты работаешь. И структуры таблицы.
← →
Scot Storch (2009-02-27 11:18) [2]
> Нужно одной транзакцией вставить запись в БД и получить
> её ID
А как получить ID добавленной записи? (имеется ввиду после выполнения SQL-запроса)
← →
Palladin © (2009-02-27 11:20) [3]http://delphimaster.net/view/3-1216374027/
← →
Johnmen © (2009-02-27 11:23) [4]
> Scot Storch (27.02.09 11:07)
> Q.Last;
А это для чего?
← →
Scot Storch (2009-02-27 11:26) [5]
> > Scot Storch (27.02.09 11:07) > Q.Last;А это для чего?
Для того чтобы установить добавленную запись текущей в таблице, тут ошибся - не Q.Last а Table.Last
← →
Ega23 © (2009-02-27 11:32) [6]
> А как получить ID добавленной записи? (имеется ввиду после
> выполнения SQL-запроса)
Для особо одарённых: это сильно зависит от СУБД и структуры таблицы.
Для MSSQL - одни подходы, для Postgres - другие, для Oracle - третьи и т.д.
← →
Scot Storch (2009-02-27 11:37) [7]DBISAM
← →
Ega23 © (2009-02-27 11:56) [8]
> DBISAM
Я не знаю, что это такое. Могу посоветовать RTFM или специализированные форумы. В мануале скорее всего что-то такое есть. Ищи про последовательности (sequence).
Но это половина беды. Вторая - какого типа у тебя ID и каким образом генерируется следующее значение. Это может быть простейшийselect IsNull(Max(ID) + 1, 1)
, это может быть последовательность, это может быть какой-нибудь "счетчик" и т.д.
← →
Johnmen © (2009-02-27 12:29) [9]
> > > Scot Storch (27.02.09 11:07) > Q.Last;А это для чего?
> Для того чтобы установить добавленную запись текущей в таблице,
> тут ошибся - не Q.Last а Table.Last
С чего ты взял, что она будет последней?
← →
Scot Storch (2009-02-27 13:00) [10]
> С чего ты взял, что она будет последней?
А какой?
← →
Медвежонок Пятачок © (2009-02-27 13:02) [11]А как получить ID добавленной записи? (имеется ввиду после выполнения SQL-запроса)
Проще получить ID не добавленной, а ID для добавляемой записи.
Как именно - смотри свой триггер на сервере
← →
Плохиш © (2009-02-27 13:03) [12]
> А какой?
любой
← →
Ega23 © (2009-02-27 13:18) [13]
> Проще получить ID не добавленной, а ID для добавляемой записи.
Это очень спорное утверждение. Очень.
← →
Медвежонок Пятачок © (2009-02-27 13:22) [14]оно спорное, если компоненты доступа продвинутые и могут вернуть значение порожденное на сервере.
← →
Медвежонок Пятачок © (2009-02-27 13:24) [15]а и продвинутые часто так делают, например фибсы.
прописываешь полю имя генератора, и при вставке некст значение генератора незаметно тянется на клиента перед инсертом
← →
Ega23 © (2009-02-27 13:29) [16]
> оно спорное, если компоненты доступа продвинутые и могут
> вернуть значение порожденное на сервере.
Я обычным банальным TQuery через миллион раз оплёванное BDE совершенно спокойно верну значение вставленной записи для identity-поля на MSSQL любой версии начиная с 7.0 (с более ранними просто не работал).
← →
Scot Storch (2009-02-27 14:06) [17]Всем спасибо за советы, сделал с использованием 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);
← →
MsGuns © (2009-02-27 15:50) [18]Замечание:
1) Текст запроса я бы писал явно без всяких format, во-первых много читабельнее, во вторых удобнее при отладке собственно запроса через оболочку (SQL explorer например)
2) Вместо динамических запросов предпочтительнее пользоваться параметрическими
← →
Медвежонок Пятачок © (2009-02-27 16:38) [19]для identity-поля на MSSQL любой версии начиная с 7.0 (с более ранними просто не работал).
Ну а ежели там не mssql?
← →
Ega23 © (2009-02-27 16:42) [20]
> Ну а ежели там не mssql?
А ежели он? Тем более, что у автора до боли знакомоеselect @@identity
в [17] проскочило...
← →
Медвежонок Пятачок © (2009-02-27 16:45) [21]ну значит я еще успел с [11]
← →
clickmaker © (2009-02-27 16:48) [22]интересно: выполняется cmp_QueryOther_, а поле получается из cmp_Query -)
← →
имя (2009-03-17 16:08) [23]Удалено модератором
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.04.26;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.005 c