2009-04-07 3 views
2
Set rs = command.Execute 
if not rs.EOF then 
    'logic here 
end if 

выше код не в строке 2, поскольку RS закрыт (возможно, провайдер OLEDB выяснил, неправильно, что это команда вставки так что не нужно ничего возвращать). Команда представляет собой инструкцию вставки:VB6 ADO Set Rs = command.Execute

Insert into log(Name,Value) values("xxx", 123); select scope_identity() 

Мне нужна идентификация с сервера в одном обратном направлении. Есть идеи?

PS: Обновленная инструкция вставки с именами полей (спасибо Эдуардо), но это не проблема.

ответ

6

Ваша проблема в том, что источник данных возвращает два набора записей. Это связано с настройкой базы данных NOCOUNT. Первый набор записей используется только для возврата записей, затронутых из инструкции insert. Второй набор записей возвращает результаты вызова SELECT SCOPE_IDENTITY. Так что вам нужно:

If rs.State = adStateClosed Then 
    Set rs = rs.NextRecordset() 
End If 

Тогда вы можете проверить EOF и все такое. Но я обычно избегаю всего этого и помещаю подобные вещи в хранимую процедуру. Затем I SET NOCOUNT ON в хранимой процедуре. И верните идентификатор в конце хранимой процедуры. Прямо сейчас ваши вставки могут быть просто такими, но логика может расти. Поместив его в хранимую процедуру, вы можете просто изменить хранимую процедуру и не менять свое скомпилированное приложение VB. Он также немного изолирует код базы данных.

Что вы не хотите делать, это SET NOCOUNT ON в вашем заявлении. То, что я думаю, влияет на все соединение, если не на всю базу данных.

1

Select @@ IDENTITY От TableName следует дать последнему добавленному идентификатор

+0

Никогда не используйте @@ Идентичность в пользу scope_identity(), если у вас нет веских оснований. –

+0

scope_identity даст мне последний вставленный идентификатор, а проблема в том, как это сделать в одном обратном направлении. –

0

Вы можете попробовать возвращенную идентификатор функции.

CREATE FUNCTION dbo.MyFunc (@name varchar(10), @value varchar(10)) 
RETURNS int 
AS 
BEGIN 
    DECLARE @rtn int 

    Insert into log(Name,Value) 
    values("xxx", 123); 

    select @rtn = scope_identity() 
    RETURN @rtn; 
END 

Хотя я думаю, что у вас есть выше, где вы делаете вставку, а затем выбор должен работать в некотором роде.

1

Является ли это SQL Server? Попробуйте добавить SET NOCOUNT ON в начале вашего SQL, например.

SET NOCOUNT ON; 
Insert into log(Name,Value) values("xxx", 123); 
select scope_identity()