powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / SCOPE_IDENTITY() в ADO
13 сообщений из 13, страница 1 из 1
SCOPE_IDENTITY() в ADO
    #32935029
BigBob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пишу клиента к базе данных (MS VC 6.0, MFC, MS SQL 2k). Выполняю следующий код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
_ConnectionPtr MyBase;
...// Установил соединеие.
// Добавляю запись
m_pBase->Execute(LPCSTR("insert into MyTable (Nik) values ('Test');"), NULL, adCmdUnknown);
// Пытаюсь определить Id добавленной записи
_RecordsetPtr rs;
rs->Open(LPCSTR("select SCOPE_IDENTITY();"), v, adOpenStatic, adLockReadOnly, adCmdText);
_variant_t v;
rs->GetFieldValue( 0 , v);
На удивление в v оказывается NULL. Где я просчитался? Не знаю даже куда и копать ;(
...
Рейтинг: 0 / 0
SCOPE_IDENTITY() в ADO
    #32935159
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В том, что это два разных батча. Подробности в боле.
Код: plaintext
1.
2.
3.
_RecordsetPtr rs;
rs->Open(LPCSTR("insert into MyTable (Nik) values ('Test'); select SCOPE_IDENTITY();"), "), v, adOpenStatic, adLockReadOnly, adCmdText);
_variant_t v;
rs->GetFieldValue( 0 , v);
...
Рейтинг: 0 / 0
SCOPE_IDENTITY() в ADO
    #32935166
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Даже лучше
Код: plaintext
set nocount on; insert into MyTable (Nik) values ('Test'); select SCOPE_IDENTITY();
а еще лучше запихать все это хозяйство в ХП.
...
Рейтинг: 0 / 0
SCOPE_IDENTITY() в ADO
    #32935353
BigBob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добавил в запрос set nocount on . Действительно SCOPE_IDENTITY() стал возвращать Id последней добавленной записи. Но вместо одной записи тепреь добавлятся шесть 8-[ ] Прямо мистикак какая-то ;( Откуда взялись лишние записи и как побороть эту напасть?
...
Рейтинг: 0 / 0
SCOPE_IDENTITY() в ADO
    #32935358
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BigBobДобавил в запрос set nocount on . Действительно SCOPE_IDENTITY() стал возвращать Id последней добавленной записи. Но вместо одной записи тепреь добавлятся шесть 8-[ ] Прямо мистикак какая-то ;( Откуда взялись лишние записи и как побороть эту напасть?
Открывайте Profiler и смотрите, чего Ваш клиент футболит серверу.
...
Рейтинг: 0 / 0
SCOPE_IDENTITY() в ADO
    #32935367
BigBob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Profiler показывает, что когда set nocount on запрос действительно выполняется шесть раз:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Audit Login		-- network protocol: TCP/IPset quoted_identifier onset implicit_transactions offset cursor_close_on_commit offset ansi_warnings onset ansi_padding onset ansi_nulls onset concat_null_yields_null onset language агббЄЁcset dateformat dmyset datefirst  1 	CtsTv Application		prog					 1716 	 55 	 2005 - 02 - 27   13 : 38 : 59 . 973 	
SQL:BatchCompleted		set nocount on; insert into Cityes (CityNik) values ('Test'); select SCOPE_IDENTITY();	CtsTv Application		prog	 0 	 10 	 0 	 0 	 1716 	 55 	 2005 - 02 - 27   13 : 38 : 59 . 990 	
SQL:BatchCompleted		set nocount on; insert into Cityes (CityNik) values ('Test'); select SCOPE_IDENTITY();	CtsTv Application		prog	 0 	 6 	 0 	 0 	 1716 	 55 	 2005 - 02 - 27   13 : 38 : 59 . 990 	
Audit Logout			CtsTv Application		prog	 0 	 33 	 0 	 30 	 1716 	 55 	 2005 - 02 - 27   13 : 38 : 59 . 973 	
Audit Login		-- network protocol: TCP/IPset quoted_identifier onset implicit_transactions offset cursor_close_on_commit offset ansi_warnings onset ansi_padding onset ansi_nulls onset concat_null_yields_null onset language агббЄЁcset dateformat dmyset datefirst  1 	CtsTv Application		prog					 1716 	 55 	 2005 - 02 - 27   13 : 39 : 00 . 067 	
SQL:BatchCompleted		set nocount on; insert into Cityes (CityNik) values ('Test'); select SCOPE_IDENTITY();	CtsTv Application		prog	 0 	 10 	 0 	 0 	 1716 	 55 	 2005 - 02 - 27   13 : 39 : 00 . 080 	
SQL:BatchCompleted		set nocount on; insert into Cityes (CityNik) values ('Test'); select SCOPE_IDENTITY();	CtsTv Application		prog	 0 	 6 	 0 	 0 	 1716 	 55 	 2005 - 02 - 27   13 : 39 : 00 . 080 	
SQL:BatchCompleted		set nocount on; insert into Cityes (CityNik) values ('Test'); select SCOPE_IDENTITY();	CtsTv Application		prog	 0 	 6 	 0 	 0 	 1716 	 55 	 2005 - 02 - 27   13 : 39 : 00 . 097 	
Audit Logout			CtsTv Application		prog	 0 	 39 	 0 	 30 	 1716 	 55 	 2005 - 02 - 27   13 : 39 : 00 . 067 	
Audit Login		-- network protocol: TCP/IPset quoted_identifier onset implicit_transactions offset cursor_close_on_commit offset ansi_warnings onset ansi_padding onset ansi_nulls onset concat_null_yields_null onset language агббЄЁcset dateformat dmyset datefirst  1 	CtsTv Application		prog					 1716 	 55 	 2005 - 02 - 27   13 : 39 : 00 . 177 	
SQL:BatchCompleted		SET NO_BROWSETABLE ON	CtsTv Application		prog	 0 	 0 	 0 	 0 	 1716 	 55 	 2005 - 02 - 27   13 : 39 : 00 . 177 	
SQL:BatchCompleted		SET FMTONLY ON set nocount on SET FMTONLY OFF	CtsTv Application		prog	 0 	 0 	 0 	 0 	 1716 	 55 	 2005 - 02 - 27   13 : 39 : 00 . 177 	
Audit Logout			CtsTv Application		prog	 0 	 17 	 0 	 0 	 1716 	 55 	 2005 - 02 - 27   13 : 39 : 00 . 177 	
Audit Login		-- network protocol: TCP/IPset quoted_identifier onset implicit_transactions offset cursor_close_on_commit offset ansi_warnings onset ansi_padding onset ansi_nulls onset concat_null_yields_null onset language агббЄЁcset dateformat dmyset datefirst  1 	CtsTv Application		prog					 1716 	 55 	 2005 - 02 - 27   13 : 39 : 00 . 207 	
SQL:BatchCompleted		set nocount on; insert into Cityes (CityNik) values ('Test'); select SCOPE_IDENTITY();	CtsTv Application		prog	 0 	 10 	 0 	 0 	 1716 	 55 	 2005 - 02 - 27   13 : 39 : 00 . 207 	
Но я же вызываю Recordset::Open() только один раз? Откуда берутся ещё пять вызовов?
...
Рейтинг: 0 / 0
SCOPE_IDENTITY() в ADO
    #32935368
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BigBobОткуда берутся ещё пять вызовов?
Чудес не бывает. Ставьте брекпоинт и смотрите.
...
Рейтинг: 0 / 0
SCOPE_IDENTITY() в ADO
    #32935808
BigBob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Конечно, я первым делом протрасировал свой код под отладчиком.
Рекодсет действиетльно отрывается только один раз.
Кроме того если убрать set rowcount on то profiler показывает один запрос и добавляется одна запись:
Код: plaintext
1.
Audit Login		-- network protocol: TCP/IPset quoted_identifier onset implicit_transactions offset cursor_close_on_commit offset ansi_warnings onset ansi_padding onset ansi_nulls onset concat_null_yields_null onset language русскийset dateformat dmyset datefirst  1 	CtsTv Application		prog					 1220 	 55 	 2005 - 02 - 27   13 : 52 : 31 . 417 	
SQL:BatchCompleted		insert into Cityes (CityNik) values ('Test #2'); select SCOPE_IDENTITY();	CtsTv Application		prog	 0 	 10 	 0 	 0 	 1220 	 55 	 2005 - 02 - 27   13 : 52 : 31 . 417 
...
Рейтинг: 0 / 0
SCOPE_IDENTITY() в ADO
    #32939220
Tracer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем точки с запятой ? без них не работает ?

авторSQL:BatchCompleted SET FMTONLY ON set nocount on SET FMTONLY OFF
Вот этот код показывает, что когда АДО пытается определить выходные параметры, он считает, что выполняет только коману SET FMTONLY ON.
Почему не понятно. MDAC какой версии ?
...
Рейтинг: 0 / 0
SCOPE_IDENTITY() в ADO
    #32939225
Tracer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сорри, не команду SET FMTONLY ON, а set nocount on
...
Рейтинг: 0 / 0
SCOPE_IDENTITY() в ADO
    #32939840
BigBob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Операционка XP SP1. А какой версии MDAC - не знаю ;( Как можно посмотреть? Или попробовать поставить последний с www.microsoft.com?
...
Рейтинг: 0 / 0
SCOPE_IDENTITY() в ADO
    #32940417
Tracer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
версию можно посмотреть тут
HKEY_LOCAL_MACHINE\Software\Microsoft\DataAccess\FullInstallVer
HKEY_LOCAL_MACHINE\Software\Microsoft\DataAccess\Version
И всё таки, попробуй выполнить эту команду без разделителя ( ; )

Код: plaintext
set nocount on insert into MyTable (Nik) values ('Test') select SCOPE_IDENTITY()
...
Рейтинг: 0 / 0
SCOPE_IDENTITY() в ADO
    #32946453
BigBob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
FullInstallVersion: 2.71.9030.4
Version: 2.0.0
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / SCOPE_IDENTITY() в ADO
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]