Можно ли как-то побороть следующее явление:
Имеется объект _ConnectionPtr (ADO), с помощью которого цепляюсь к БД SQL (2000).
С использованием этого соединения формируется (открывается) некоторый рекордсет (_RecordsetPtr).
Проблема: пытаюсь создать временную таблицу ( create table #tmp(...) с помощью метода Execute объекта _ConnectionPtr ). Метод отрабатывает без ошибок, но таблица не создается
При выполнении того же самого без открытого рекордсета — таблица создается.
Вопрос: это такой глюк или я чего-то не так делаю?
Здравствуйте, Аноним, Вы писали:
А>Можно ли как-то побороть следующее явление:
А>Имеется объект _ConnectionPtr (ADO), с помощью которого цепляюсь к БД SQL (2000).
А>С использованием этого соединения формируется (открывается) некоторый рекордсет (_RecordsetPtr).
А>Проблема: пытаюсь создать временную таблицу ( create table #tmp(...) с помощью метода Execute объекта _ConnectionPtr ). Метод отрабатывает без ошибок, но таблица не создается
А>При выполнении того же самого без открытого рекордсета — таблица создается.
А>Вопрос: это такой глюк или я чего-то не так делаю?
Вопрос не совсем понятен. Как открывается рекордсет ?
Вообще есть такая штука как
"SET NOCOUNT ON EXECUTE ..."
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Аноним, Вы писали:
А>>Можно ли как-то побороть следующее явление:
А>>Имеется объект _ConnectionPtr (ADO), с помощью которого цепляюсь к БД SQL (2000).
А>>С использованием этого соединения формируется (открывается) некоторый рекордсет (_RecordsetPtr).
А>>Проблема: пытаюсь создать временную таблицу ( create table #tmp(...) с помощью метода Execute объекта _ConnectionPtr ). Метод отрабатывает без ошибок, но таблица не создается
А>>При выполнении того же самого без открытого рекордсета — таблица создается.
А>>Вопрос: это такой глюк или я чего-то не так делаю?
А>Вопрос не совсем понятен. Как открывается рекордсет ?
А> Вообще есть такая штука как
А>А>"SET NOCOUNT ON EXECUTE ..."
А>
Собственно, не совсем понятно: при чем тут SQL-команда Set Nocount On..., которая, по-моему, включает/выключает вывод в окне трассировки?
Открываю так:
rs->Open(_variant_t(query),_variant_t((IDispatch *)con,true),adOpenStatic,adLockReadOnly,adCmdText);
где
rs — _RecordsetPtr rs;
con — _ConnectionPtr con;
query- SQL — запрос (ну, скажем, такой:
select sName from table where nId=10
)
Здравствуйте, Alex_VC, Вы писали:
1. ADO открывает дополнительный коннект в том случае, если у вас есть недофетченная
выборка серверного курсора и вы пытаетесь сделать что-нибудь еще.
Потом он ессно уносить вместе с собой и #t
Пример.
int main(){
_bstr_t ConnStr = "Provider=SQLOLEDB; \
Data Source=(local); \
Initial Catalog=pubs; \
Integrated Security=SSPI";
_ConnectionPtr adoConn;
try {
adoConn.CreateInstance(__uuidof(Connection));
adoConn->CommandTimeout = 300;
adoConn->CursorLocation = adUseServer;
// adoConn->CursorLocation = adUseClient;
adoConn->IsolationLevel = adXactReadCommitted;
adoConn->Attributes = 0;
adoConn->Open(ConnStr,"","",adConnectUnspecified);
_bstr_t SQL;
SQL = "select * from sysobjects";
_RecordsetPtr adoRSTmp = adoConn->Execute(SQL,0,adOptionUnspecified);
// while(! adoRSTmp->adoEOF)adoRSTmp->MoveNext();
//// adoRSTmp->Close();
SQL = "create table #t(A varchar(30))";
adoConn->Execute(SQL,0,adOptionUnspecified);
SQL = "insert into #t select au_id from authors";
adoConn->Execute(SQL,0,adOptionUnspecified);
SQL = "select * from #t";
_RecordsetPtr adoRS = adoConn->Execute(SQL,0,adOptionUnspecified);
_bstr_t b;
while(! adoRS->adoEOF){
b = adoRS->Fields->Item[0L]->Value;
MessageBoxW(0, b, L"", 0);
adoRS->MoveNext();
}
adoRS->Close();
...
При adoConn->CursorLocation = adUseClient все нормально
При adoConn->CursorLocation = adUseServer нужно или закрыть rs или его дофетчить