ADODB::_RecordsetPtr::Open выдает исключение, подобное истечению времени ожидания запроса в c

#c #sql #adodb

#c #sql #adodb

Вопрос:

здесь я пытаюсь запросить таблицу sql server 2008 r2 из моего приложения на c . Он содержит 21 54 514. но он выдает исключение типа «Истек срок ожидания запроса» . ниже приведена моя кодовая база

 ADODB::_ConnectionPtr           m_pDBConnection;
ADODB::_RecordsetPtr                m_pRS;

m_pDBConnection.CreateInstance("ADODB.Connection");
m_pRS.CreateInstance("ADODB.RecordSet");

m_pRS->Open(wstrSQL.c_str(), _variant_t((IDispatch *) m_pDBConnection, true),
        ADODB::adOpenStatic,
        ADODB::adLockReadOnly,
        ADODB::adCmdText);
  

Когда выполняется приведенная выше строка, она выдает вышеупомянутое исключение.

я знаю проблему, проблема на самом деле связана с установленным временем ожидания по умолчанию. на самом деле это 15 секунд.

может кто-нибудь, пожалуйста, рассказать, как сбросить или изменить время ожидания в ADODB::_RecordsetPtr. Я много искал в Google, мы можем сбросить время ожидания для ADODB::_ConnectionPtr, но не для ADODB::_RecordsetPtr.:_RecordsetPtr в c — Stack Overflow. для меня это было бы полезно. Заранее спасибо.

Ответ №1:

В соответствии с процессом кодирования вам необходимо установить CommandTimeout для соединения и для команды.

 // The recordset for the result
ADODB::_RecordsetPtr rs;
// Timeout on connection
m_pDBConnection->CommandTimeout = 60;
// Need to create command first, then configure it, then open RecordSet
ADODB::_CommandPtr cmd(__uuidof(ADODB::Command));
cmd->ActiveConnection = m_pDBConnection;
cmd->CommandText = wstrSQL.c_str();
cmd->CommandTimeout = 60;
rs->Open(cmd, vtMissing, ADODB::adOpenStatic, ADODB::adLockReadOnly, ADODB::adCmdText);
// Reset the timeout on the connection
m_pDBConnection->CommandTimeout = 15;
  

Комментарии:

1. @user1450931 Если мой ответ помог вам, пожалуйста, примите его и, возможно, даже поддержите. Спасибо.

2. Спасибо @WernerHenze. Я использовал это для vba, а не для c , но я не видел никаких вопросов vba, которые объединяли бы все необходимые свойства (соединение, запрос, время ожидания) в одну команду, а затем выполняли ее с набором записей. Это помогло мне!

3. Мне это нравится, но можете ли вы действительно передать cmd в качестве первого параметра в вызов Open? Не будет компилироваться для меня. Вместо rs->Open я бы попробовал, cmd->Execute(NULL, NULL, adCmdStoredProc) который должен вернуть этот _RecordsetPtr объект

4. @demongolem Код компилируется и работает для меня. Что касается Open, см. msdn.microsoft.com/en-us/library/windows/desktop /… .