Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1236858762
Андрей (начинающий)
2009-03-12 14:52
2009.04.26
Модальная форма


15-1235293014
@!!ex
2009-02-22 11:56
2009.04.26
Помогите сделать уведомление об ответе


6-1202258166
Alex603081
2008-02-06 03:36
2009.04.26
ClientSocket


15-1235299343
Den_
2009-02-22 13:42
2009.04.26
Что бы придумать для своей программы (не совсем шароварное)?


2-1237123155
бобик
2009-03-15 16:19
2009.04.26
позиция курсора





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский