WEB форумы на jedi
[Форум] [Помощь] [Поиск] [Выйти]
Добро пожаловать, [info]User

WEB форумы на jedi [ПОИСК] [Архив до 03.2006]

Тема MSSQL + VBScript К предыдущему сообщению На следующее сообщение Программирование

Отправил HPawel в 15:44 13.03.2002[Ответить]
_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


Отправил Rain в 17:00 13.03.2002[Ответить]
>> (SELECT id = @@identity)

Я не понял, нафига id в кавычках???


Отправил HPawel в 17:35 13.03.2002[Ответить]
SELECT @@identity AS last
SELECT @@identity AS 'last'
SELECT @@identity AS last
SELECT last = @@identiy
SELECT last = @@identity

афаик одно и то же...


Отправил HPawel в 17:40 13.03.2002[Ответить]
На самом деле, конечно лучше сделать так:
_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_


Отправил Scorpion в 21:25 13.03.2002[Ответить]
Это что у тебя типа проверка на вшивость? Раз сам знаешь на кой спрашиваешь? Выпендрежь нынче не в моде
Так любой может кусок своего кода кинуть сказать что в нем проблема а потом кинуть личную переделку.
Создателю конечно проще вникать чем постороннему лицу. Поэтому давайте кидать вопросы по существу а не загадки.


Отправил HPawel в 00:17 14.03.2002[Ответить]
Блин, типа прочитай то что я написал, а потом говори...
Для тех, кто в танке: мне непонятно почему тот кусок не работал.
Кроме того, он не настолько сложен, чтобы понять что происходит и довольно полон, чтоб не мучаться загадками, и вообще-то как мне кажется, должен работать.


Отправил Nika в 01:08 14.03.2002[Ответить]
/me в танке и не хочет оттуда вылезать :)


Отправил HPawel в 04:12 14.03.2002[Ответить]
Тебе не понятно, зачем я спросил? Что мне неинтересно просто сделать что-то, а кроме того интересно понять почему другой способ не работает?

Отвечу: возможно тот, другой способ будет более эффективным в другом случае ;-)


Отправил NightWing в 13:19 14.03.2002[Ответить]
set rs = conn.execute (insert into table() values(); select mid = @@identity)
mid = rs(mid)


Отправил HPawel в 16:18 14.03.2002[Ответить]
У меня не работает... Ты мне это уже предлагал :-)
Кроме того, rs.fields.count = 0


Отправил Mish-a в 16:54 14.03.2002[Ответить]
Я делаю так (работает всегда) (особенно быстро работает, если по 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-сервер хранит ее откомпилированный вариант, а также готовый план запроса).
Ну и кроме того, если нужно что-то исправить - то правиться одна процедура, а не приходится перелопачивать из-за этого пол-сайта.


Отправил greg в 18:27 14.03.2002[Ответить]
Хочу внести свою лепту. Имхо вариант Винга самый надёжный.
Вариант Mich-a ненадёжен по следующей причине - на время трансакции таблица открыта на запись для других пользователей, и есть вероятность что кто-то вставит ещё одну строку в таблицу перед выполнением запроса на чтените select ResultID = max (id)
или во время его.
Переменная @@identity хранит значение identity только что вставленной строки для текущего пользователя.
Серверные процедуры не имеет смысла использовать для несложных запросов...


Отправил NightWing в 21:28 14.03.2002[Ответить]
Идеальный вариант - использовать @@identity в хранимой процедуре. Можно, конечно, сделать set transaction isolation level serializable, но это может приветсти к кратким deadlock'ам. Опять же, как верно подметил Greg, пользовать sp для редких действий смысла нет - лучше зафигачить врям в код.


Отправил HPawel в 23:37 14.03.2002[Ответить]
Так ещё раз повторю - не работает прям в коде:
set rs = dbconn.Execute(INSERT INTO ...; SELECT id = @@identity)
WScript.Echo rs.fields.count
--- результат ---
0
Если тоже самое зафигачить например в SQL Analyser'е, то всё ок... Всё возвращается.... В чём трабл?


Отправил Mish-a в 10:38 15.03.2002[Ответить]
Для Грега: После вставки новой записи таблица блокируется до завершения транзакции. Так что вставить в нее строку будет невозможно.
На счет sp - не согласен. Считаю, что следует по возможности никогда не использовать открытые запросы, а все делать через sp.

Для HPawel:А если попробовать вот так -
set rs = dbconn.Execute(INSERT INTO ... SELECT @@identity)
WScript.Echo rs.fields.count