Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Добавление в базу


Страницы:   1 2

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;

А это для чего?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо