ADO и временные таблицы SQL
От: Аноним  
Дата: 28.12.04 08:08
Оценка:
Можно ли как-то побороть следующее явление:

Имеется объект _ConnectionPtr (ADO), с помощью которого цепляюсь к БД SQL (2000).
С использованием этого соединения формируется (открывается) некоторый рекордсет (_RecordsetPtr).
Проблема: пытаюсь создать временную таблицу ( create table #tmp(...) с помощью метода Execute объекта _ConnectionPtr ). Метод отрабатывает без ошибок, но таблица не создается
При выполнении того же самого без открытого рекордсета — таблица создается.
Вопрос: это такой глюк или я чего-то не так делаю?
Re: ADO и временные таблицы SQL
От: Аноним  
Дата: 29.12.04 07:32
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Можно ли как-то побороть следующее явление:


А>Имеется объект _ConnectionPtr (ADO), с помощью которого цепляюсь к БД SQL (2000).

А>С использованием этого соединения формируется (открывается) некоторый рекордсет (_RecordsetPtr).
А>Проблема: пытаюсь создать временную таблицу ( create table #tmp(...) с помощью метода Execute объекта _ConnectionPtr ). Метод отрабатывает без ошибок, но таблица не создается
А>При выполнении того же самого без открытого рекордсета — таблица создается.
А>Вопрос: это такой глюк или я чего-то не так делаю?


Вопрос не совсем понятен. Как открывается рекордсет ?
Вообще есть такая штука как

"SET NOCOUNT ON  EXECUTE ..."
Re[2]: ADO и временные таблицы SQL
От: Alex_VC  
Дата: 30.12.04 08:45
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Аноним, Вы писали:


А>>Можно ли как-то побороть следующее явление:


А>>Имеется объект _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

)
Re[3]: ADO и временные таблицы SQL
От: ZrenBy Россия  
Дата: 30.12.04 09:24
Оценка:
Здравствуйте, 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 или его дофетчить
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.