Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.04.26;
Скачать: CL | DM;

Вниз

Добавление в базу   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.013 c
15-1235505481
TStas
2009-02-24 22:58
2009.04.26
Что такое печать в файл?


4-1208772445
Alex
2008-04-21 14:07
2009.04.26
D5,D7 при установке на VMWARE - не работает debuger


15-1235654209
Кто б сомневался
2009-02-26 16:16
2009.04.26
Анабиоз. Сон разума.


10-1155687227
big_bugzy
2006-08-16 04:13
2009.04.26
Как работать с интерфейсами ,если в TLB нету самого объекта?


15-1235729427
Галинка
2009-02-27 13:10
2009.04.26
SAX или DOM