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...
Пока на собственное сообщение не было ответов, его можно удалить.