[Форум] [Помощь] [Поиск] [Выйти] |
Добро пожаловать, User |
|
|
| ||
_code_ dim dbconn, dbrs, Item_ID set dbconn = CreateObject(ADODB.Connection) dbconn.Open(...) dbconn.Execute(INSERT INTO [table] (NAME) VALUES ('blablabla')) set dbrs = dbconn.Execute(SELECT id = @@identity) Item_ID = dbrs(id) _endcode_ Объясните мне почему Item_ID после этого NULL? [table] _имеет_ поле Item_ID int identity 1,1 |
| ||
>> (SELECT id = @@identity) Я не понял, нафига id в кавычках??? |
| ||
SELECT @@identity AS last SELECT @@identity AS 'last' SELECT @@identity AS last SELECT last = @@identiy SELECT last = @@identity афаик одно и то же... |
| ||
На самом деле, конечно лучше сделать так: _code_ dbrs = CreateObject(ADODB.Recordset) dbrs.CursorType = adOpenKeySet dbrs.LockType = adLockOptimistic dbrs.ActiveConnection = dbconn dbrs.Open SELECT * FROM [table] dbrs.AddNew Array(Name), Array('blablabla') Item_ID = dbrs(Item_ID) _endcode_ |
| ||
Это что у тебя типа проверка на вшивость? Раз сам знаешь на кой спрашиваешь? Выпендрежь нынче не в моде Так любой может кусок своего кода кинуть сказать что в нем проблема а потом кинуть личную переделку. Создателю конечно проще вникать чем постороннему лицу. Поэтому давайте кидать вопросы по существу а не загадки. |
| ||
Блин, типа прочитай то что я написал, а потом говори... Для тех, кто в танке: мне непонятно почему тот кусок не работал. Кроме того, он не настолько сложен, чтобы понять что происходит и довольно полон, чтоб не мучаться загадками, и вообще-то как мне кажется, должен работать. |
| ||
/me в танке и не хочет оттуда вылезать :) |
| ||
Тебе не понятно, зачем я спросил? Что мне неинтересно просто сделать что-то, а кроме того интересно понять почему другой способ не работает? Отвечу: возможно тот, другой способ будет более эффективным в другом случае ;-) |
| ||
set rs = conn.execute (insert into table() values(); select mid = @@identity) mid = rs(mid) |
| ||
У меня не работает... Ты мне это уже предлагал :-) Кроме того, rs.fields.count = 0 |
| ||
Я делаю так (работает всегда) (особенно быстро работает, если по ID есть кластерный индекс :) ) 1. Пишем хранимую процедуру CREATE PROCEDURE myproc @values typeofvalues...., @ResultID int output AS begin transaction insert into table() values() select ResultID = max (id) from table commit transaction 2. на VBScript'е пишем так set Cn = Server.CreateObject (ADODB.Connection) Cn. Open (...) set Cmd = Server.CreateObject (ADODB.Command) Cmd.ActiveConnection = Cn Cmd.CommandType = adCmdStoredProc Cmd.CommandText = myproc Cmd.Parameters.Append (Cmd.CreateParameter (values names,<values types>, adParamInput, <values sizes>, <values>)) Cmd.Parameters.Append (Cmd.CreateParameter (ResultID,adInteger, adParamOutput, 4, 0)) Cmd.Execute ResultID = Cmd (ResultID).Value Cn.Close Писать в скрипте открытые запросы не следует, так как хранимая процедура выполняется горазда быстрее (так как sql-сервер хранит ее откомпилированный вариант, а также готовый план запроса). Ну и кроме того, если нужно что-то исправить - то правиться одна процедура, а не приходится перелопачивать из-за этого пол-сайта. |
| ||
Хочу внести свою лепту. Имхо вариант Винга самый надёжный. Вариант Mich-a ненадёжен по следующей причине - на время трансакции таблица открыта на запись для других пользователей, и есть вероятность что кто-то вставит ещё одну строку в таблицу перед выполнением запроса на чтените select ResultID = max (id) или во время его. Переменная @@identity хранит значение identity только что вставленной строки для текущего пользователя. Серверные процедуры не имеет смысла использовать для несложных запросов... |
| ||
Идеальный вариант - использовать @@identity в хранимой процедуре. Можно, конечно, сделать set transaction isolation level serializable, но это может приветсти к кратким deadlock'ам. Опять же, как верно подметил Greg, пользовать sp для редких действий смысла нет - лучше зафигачить врям в код. |
| ||
Так ещё раз повторю - не работает прям в коде: set rs = dbconn.Execute(INSERT INTO ...; SELECT id = @@identity) WScript.Echo rs.fields.count --- результат --- 0 Если тоже самое зафигачить например в SQL Analyser'е, то всё ок... Всё возвращается.... В чём трабл? |
| ||
Для Грега: После вставки новой записи таблица блокируется до завершения транзакции. Так что вставить в нее строку будет невозможно. На счет sp - не согласен. Считаю, что следует по возможности никогда не использовать открытые запросы, а все делать через sp. Для HPawel:А если попробовать вот так - set rs = dbconn.Execute(INSERT INTO ... SELECT @@identity) WScript.Echo rs.fields.count |