Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Добавление записи в НД


Автор: NieL 27.2.2009, 11:24
Необходимо добавить запись в таблицу БД и установить ее текущей. Пока что 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;

Автор: Kbl4AH 27.2.2009, 11:30
2-й вариант имхо лучше... во-первых, не на свою не нарвешься, во-вторых, доп. запрос не требуется.

Автор: pseud 27.2.2009, 12:29
оба варианта плохи:
1. Зачем Last если нам известен (я так понимаю уникальный) id? Почему тогда не Locate?
2. С детства аллергия на TTable.

Добавлено через 1 минуту и 30 секунд

--------
да и 
Код

 Q.SQL.Text := Format('Insert into Orders (link_id) values (%d)', [link_id]);
 Q.ExecSQL;
 Q.Last;

Last можно сделать в выборке. а выборки в Q нет.

Автор: Deniz 27.2.2009, 12:36
NieL, а как насчет правил написания сообщения?
Код
Обязательно указание:
1. Базы данных (Paradox, Oracle и т.п.)
2. Способа доступа (ADO, BDE и т.д.)


Kbl4AH, про TTable лучше вообще забыть.

Автор: NieL 27.2.2009, 12:51
Цитата

1. Зачем Last если нам известен (я так понимаю уникальный) id? Почему тогда не Locate?


link_id - не является уникальным id, он принимает значения в диапазоне 1..3, а Уникальный id (Item_id) генерится автоматически при добавлении.

C 
Код
Q.Last
 я ошибся - у меня здесь Table.Last;

Цитата

NieL, а как насчет правил написания сообщения?


1. DBISAM
2. свой набор компонент постовляемый с базой (в принципе аналог BDE)

Автор: pseud 27.2.2009, 13:12
Цитата(NieL @  27.2.2009,  12:51 Найти цитируемый пост)

1. DBISAM
2. свой набор компонент постовляемый с базой (в принципе аналог BDE)

раз как БДЕ, то вот БДЕ пример.
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  iLinkID: Integer;
  iID: Integer;
begin
  iLinkID := 777;

  with TQuery.Create(Database1) do
  try
    SQL.Text := Format('INSERT INTO orders (link_id) VALUES (%d)', [iLinkID]);
    ExecSQL;
    SQL.Text := 'SELECT MAX(item_id) AS new_id FROM orders';
    Active := True;
    iID := FieldByName('new_id').AsInteger;
  finally
    Free;
  end;

  Query1.Active := False;
  Query1.Active := True;
  Query1.Locate('item_id', VarArrayOf([iID]), []);
end;

Query1 - твоя выборка для грида (наверно). например такая:
Код

SELECT * FROM orders

Автор: Deniz 27.2.2009, 13:21
Цитата(NieL @  27.2.2009,  15:51 Найти цитируемый пост)
1. DBISAM
а там есть возможность получить id только что вставленной тобой записи?

Автор: NieL 27.2.2009, 13:31
Код

SQL.Text := 'SELECT MAX(item_id) AS new_id FROM orders';

Но ведь в этом случае есть шанс нарваться не на "свою" запись? 

Автор: pseud 27.2.2009, 13:37
Цитата(NieL @  27.2.2009,  13:31 Найти цитируемый пост)
Но ведь в этом случае есть шанс нарваться не на "свою" запись? 


 шанс мизерный

Автор: Kbl4AH 27.2.2009, 13:39
pseud, Deniz... причем здест Тейбл? Главное есть Датасет.... а если есть Датасет, то после 
Код

 Датасет.Append;
 Датасет.FieldByName('link_id').AsInteger := link_id;
 Датасет.Post;

будет активна именно добавленная запись... или я чего-то не понимаю smile 

Автор: NieL 27.2.2009, 13:43
Кажется нашел способ:

Код

insert into orders (link_id) values (%d); select @@identity


Но возможно в нем есть недостатки?

Автор: pseud 27.2.2009, 14:37
Kbl4AH, возможно с логикой использования TTable все нормально.
Но я не хочу его обсуждать впринципе.
Потому как:
Цитата(pseud @  27.2.2009,  12:29 Найти цитируемый пост)
2. С детства аллергия на TTable.


Добавлено через 1 минуту и 45 секунд
Цитата(NieL @  27.2.2009,  13:43 Найти цитируемый пост)
Кажется нашел способ:

вопрос сугубо к спецам DBISAM.
но что-то мне подсказывает, что select @@identity вернет следующее значение счетчика.

Автор: Kbl4AH 27.2.2009, 14:38
Цитата(pseud @  27.2.2009,  14:37 Найти цитируемый пост)
Kbl4AH, возможно с логикой использования TTable все нормально.

Я его сам никогда не использовал...
Я про случай DBGrid-TDataSource-TDataSet

Автор: pseud 27.2.2009, 14:57
Цитата(Kbl4AH @  27.2.2009,  14:38 Найти цитируемый пост)
Я его сам никогда не использовал...
Я про случай DBGrid-TDataSource-TDataSet

чтоб сработал 
Код

DataSet.Insert

DataSet должен быть с двунапарвленным курсором (тот самый TTable)
именно этого я и не люблю.

Автор: NieL 27.2.2009, 15:03
"Значение полю со свойством IDENTITY присваивается автоматически в момент создания новой записи. Новое значение - это последнее использованное значение плюс некоторая фиксированная величина. Обратите внимание, новое значение опирается не на максимальное значение в существующих записях, а на последнее использованное значение. Это значит, что записи с последним использованным значением физически может не существовать, тем не менее, это значение будет использовано.".
 
В моем случае  при каждом добавлении будет возвращено значение соответствующее значению уникальной записи, или я не прав?

Автор: Kbl4AH 27.2.2009, 15:13
Цитата(pseud @  27.2.2009,  14:57 Найти цитируемый пост)
DataSet должен быть с двунапарвленным курсором

а разве бывают DataSet с однонаправленным курсором? какие?

Автор: pseud 27.2.2009, 15:16
Цитата(NieL @  27.2.2009,  15:03 Найти цитируемый пост)
В моем случае  при каждом добавлении будет возвращено значение соответствующее значению уникальной записи, или я не прав?

повторяю: вопрос сугубо к спецам DBISAM.

а теперь вопрос к тебе - транзакции поддерживаются? процедуры?

Добавлено @ 15:21
Цитата(Kbl4AH @  27.2.2009,  15:13 Найти цитируемый пост)
а разве бывают DataSet с однонаправленным курсором? какие?


давай отойдем от понятий "одно/двунаправленные". чтоб нас не обвинили в делитантстве.

чем плох TTable - он открывает полный доступ первому открывшему таблицу и закрывает всем остальным.
о многопользовательском режиме сразу можно забыть.

Добавлено @ 15:23
Цитата

TTable provides direct access to every record and field in an underlying database table, whether it is from Paradox, dBASE, Access, FoxPro, an ODBC-compliant database, or an SQL database on a remote server, such as InterBase, Oracle, Sybase, MS-SQL Server, Informix, or DB2.


Добавлено @ 15:24
да к тому же выгребает абсолютно все записи на клиента.



блин несу получепуху от недостатка времени. обещал себе не трогать его и не буду.

Автор: Akella 27.2.2009, 16:33
А нет ли у этой СУБД поддержки returning?
Код

insert into table (a, b) values(10, 20) returning id

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)