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

Вниз

Как узнать "автономер" сохраняемой записи?   Найти похожие ветки 

 
КирилЛ   (2009-02-06 15:07) [0]

Сделал ключевым полем в таблице - автономер. Как узнать его после сохранения записи в базе? (ADO + Access)


 
Anatoly Podgoretsky ©   (2009-02-06 15:28) [1]

> КирилЛ  (06.02.2009 15:07:00)  [0]

Иногда надо и документацию читать, а в ней сказано SELECT @@IDENTITY


 
КирилЛ   (2009-02-06 16:12) [2]

> Anatoly Podgoretsky ©   (06.02.09 15:28) [1]

правильно ли я Вас понимаю:
... //создаю новую запись с помощью INSERT
ADOQuery.Close;
ADOQuery.SQL.Text:="SELECT @@IDENTITY FROM TableMain";
ADOQuery.Open;
num:=ADOQuery.Field[0].AsInteger;

так?


 
Palladin ©   (2009-02-06 16:21) [3]


> КирилЛ   (06.02.09 16:12) [2]

почти

http://delphimaster.net/view/3-1216374027/


 
КирилЛ   (2009-02-06 18:20) [4]

> Palladin ©   (06.02.09 16:21) [3]

var
cm: TADOCommand;
ds: TADOQuery;
..

cm := TADOCommand.Create(nil);
cm.Connecton := ..
cm.CommandText := "Insert ...   "+" Select @@indentity";
ds := TADOQuery.Create(nil);
ds.recordset := cm.execute;
NewID :=  ds.recordset.Fields[0].AsInteger;
ds.Free;
cm.Free;

Вы про это? Обязательно нужен TADOCommand?
Или можно решить всё с одним ADOQuery?


 
Anatoly Podgoretsky ©   (2009-02-06 18:37) [5]

> КирилЛ  (06.02.2009 16:12:02)  [2]

А советы на практике проверять умеешь?


 
КирилЛ   (2009-02-07 08:41) [6]

> Anatoly Podgoretsky ©   (06.02.09 18:37) [5]

Проверил: ошибка - "Пропущен символ (;) в конструкции SQL"!
INSERT INTO MainTable (FIO, Nazv) VALUES (:FIO, :Nazv) Select @@indentity
пробовал разные варианты...
В чём ошибка?


 
sniknik ©   (2009-02-07 09:38) [7]

> В чём ошибка?
access (jet) не позволяет пакеты комманд, только по одной.

и кстати, почему из всех ответов выбран такой неудачный? выбор не по содержанию, а по количеству кода в нем?


 
КирилЛ   (2009-02-07 10:07) [8]

> access (jet) не позволяет пакеты комманд, только по одной.
Спасибо!
> и кстати, почему из всех ответов выбран такой неудачный?
Да меня самого запутали! Правильно я думал:
> ... //создаю новую запись с помощью INSERT
> ADOQuery.Close;
> ADOQuery.SQL.Text:="SELECT @@IDENTITY FROM TableMain";
> ADOQuery.Open;
> num:=ADOQuery.Fields[0].AsInteger;


Вопросик на последок:
Почему ADOQuery.RecordCount после @@IDENTITY > 1?
Я так понял, что он должен возвращать только значение поля "автосчётчик"!


 
sniknik ©   (2009-02-07 13:14) [9]

> Да меня самого запутали! Правильно я думал:
миллион записей из таблицы ради одного значения это правильно? ...

> Почему ADOQuery.RecordCount после @@IDENTITY > 1?
вот и я про то же, и Palladin в [3] наверняка это же имел в виду когда ссылку приводил, а ты выбрал оттуда не пойми что.


 
КирилЛ   (2009-02-08 09:44) [10]

> sniknik ©   (07.02.09 13:14) [9]
реально, что я ещё там смог там найти:
Select IsNull(max([id])+1, 1) FROM [SomeTable]
остальное как-то абстрактно:
> написать универсальную функцию и подключить ее
> синхронное выполнение запросов
> RETURNING. Это правда тоже не в Access-е, но какая нахрен разница
подскажите - что я должен был там увидеть?

И вот max([id])+1 мне понятен, а IsNull(max([id])+1, 1) - это что за конструкция?


 
palva ©   (2009-02-08 11:59) [11]


> Select IsNull(max([id])+1, 1) FROM [SomeTable]

У меня такое не работает. Функция IsNull требует один аргумент и возвращает истину, если этот аргумент NULL. Я бы предложил такой вариант:
SELECT IIF(MAX(id) IS NULL, 0, MAX(id)) + 1 FROM Table1


 
sniknik ©   (2009-02-08 12:33) [12]

> подскажите - что я должен был там увидеть?
Palladin ©   (18.07.08 13:56) [2]
sniknik ©   (18.07.08 14:09) [4]
sniknik ©   (18.07.08 16:30) [10]

ну и вообще все обсуждение, чтобы понять  access <> mssql <> oracle и т.д. (верно и обратное), и начать относится с осторожностью к постам где написано "это не аксесс(/...) но ..." такие требуют проверок и доработок по месту (возможно требуют конечно...)

> - это что за конструкция?
еще одна конструкция никакого отношения к аксессу не имеющая.

> Я бы предложил такой вариант:
> SELECT IIF(MAX(id) IS NULL, 0, MAX(id)) + 1 FROM Table1
на форуме извращенцев он бы занял призовое место... и к тому же это тоже нерабочая для ассесс конструкция.


 
sniknik ©   (2009-02-08 12:55) [13]

и кстати до ссылки можно бы и не доходить...
смотрю Anatoly Podgoretsky ©   (06.02.09 15:28) [1] и тут дал правильный совет, особенно что касается документации... т.к. именно из за нее ты похоже все понимаешь через кривую призму своих представлений... читал бы доку, понял бы сразу.


 
palva ©   (2009-02-08 14:22) [14]


> это тоже нерабочая для ассесс конструкция

В Access это работает. А другой работающей конструкции для этой цели я не смог придумать, да и в ветке никто не предложил.


 
sniknik ©   (2009-02-08 15:05) [15]

> В Access это работает.
компилируется? - да. выдает результат? - а как же. но это не рабочая конструкция. т.к. результат непредсказуем.

сделай 2 коннекта (ADOConnect) к одной базе, подцепи туда все что полагается (ADOCommand с инсертом, ADODataSet с твоим запросом) и попробуй погонять в разных вариантах, типа
инсерт1  
инсерт2
получитьID1
получитьID2
ну и показать ID1/2
будешь удивлен результатами, особенно если попытаеш предсказать что там должно получится.

> да и в ветке никто не предложил.
???
сколько раз повторялось
SELECT @@IDENTITY

и все одно "никто"?


 
palva ©   (2009-02-08 15:42) [16]


> это не рабочая конструкция. т.к. результат непредсказуем.

Еще одно определение не рабочей конструкции? Конструкция рабочая, так как работает и выдает ровно то, что попросил программист.

> SELECT @@IDENTITY
> и все одно "никто"?

Никто, значит никто. Могу еще раз написать, если до вас плохо доходит. А то что вы написали, это не ответ на вопрос, заданный в конце [10].


 
sniknik ©   (2009-02-08 16:26) [17]

> так как работает и выдает ровно то, что попросил программист.
т.е. если оно будет выдавать одну и ту же цифру там где ожидаются разные (коннекты то разные) и эта цифра даже не будет равна той, что ожидается по сути запроса (max+1, т.е. от последнего инсерта) то это именно то что попросил программист?
может лучше тогда сразу все программирование на генератор случайных чисел перевести?

> А то что вы написали, это не ответ на вопрос, заданный в конце [10].
а, так ты оказывается отвечал на чисто частный вопрос о конструкции, а пример запроса выбрал в соответствии с ответом на основной, и ничего не сказал об этом, это чисто так, чтобы побольше запутать...
> если до вас плохо доходит.
теперь дошло. больше путаницы у начинающих = меньше конкуренции в будущем.
молодец. все правильно сделал. (© из какой то глупой рекламы)


 
palva ©   (2009-02-08 16:43) [18]


> а, так ты оказывается отвечал на чисто частный вопрос о конструкции...

Вообще-то да. С основным вопросом автор, как я понял уже, разобрался. Он задал дополнительный вопрос о некоей конструкции, которая меня самого привела в недоумение. Я и написал, что у меня это не работает. Я написал свой вариант. Может быть, можно было бы написать лучше, раз этот вариант является извращением. Мне было бы интересно об этом узнать. Вариант с COALESCE у меня тоже не заработал.



Страницы: 1 вся ветка

Текущий архив: 2009.03.29;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.026 c
3-1215183670
BBCHa
2008-07-04 19:01
2009.03.29
TADOQuery и BLOB-поле


15-1233084580
Eraser
2009-01-27 22:29
2009.03.29
Скрыть строку от отладчика и хекс-редактора


4-1207281000
Тыщ
2008-04-04 07:50
2009.03.29
Функции в TlHelp32


15-1232360686
XentaAbsenta
2009-01-19 13:24
2009.03.29
Чем выловить и записать на диск весь


4-1207145739
kolj
2008-04-02 18:15
2009.03.29
Tapi -> lineanswer