Захватить вывод T-SQL PRINT в ADO? - PullRequest
0 голосов
/ 30 октября 2018

Можно ли захватить PRINT вывод из T-SQL в ADO?

Например:

PRINT 'Before the thing'
SELECT * FROM sys.tables
PRINT 'After the thing'

Возможно ли в ADO получать эти сообщения PRINT?

Я пытался подключиться к событию InfoMessage , но оно никогда не запускалось. (хотя ExecuteComplete есть; что приятно)

ConnectionEvents

Для вашего удобства здесь приведены все события, отображаемые объектом ADO Connection:

[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("00000402-0000-0010-8000-00AA006D2EA4")]
public interface IConnectionEvents
{
   void InfoMessage(Error pError, ref EventStatusEnum, Connection, pConnection);
   void BeginTransComplete(Integer TransactionLevel, Error pError, ref EventStatusEnum adStatus, Connection pConnection);
   void CommitTransComplete(Error pError, ref EventStatusEnum adStatus, Connection pConnection);
   void RollbackTransComplete(Error pError, ref EventStatusEnum adStatus, Connection pConnection);
   void WillExecute(ref string Source, ref CursorTypeEnum CursorType, ref LockTypeEnum LockType, ref Integer Options, ref EventStatusEnum adStatus, Command pCommand, _Recordset pRecordset, Connection pConnection);
   void ExecuteComplete(Integer RecordsAffected, Error pError, ref adStatus EventStatusEnum, Command pCommand, Recordset pRecordset, Connection pConnection);
   void WillConnect(ref string ConnectionString, ref string UserID, ref string Password, ref Integer Options, ref EventStatusEnum adStatus, Connection pConnection);
   void ConnectComplete(Error pError, ref EventStatusEnum adStatus, Connection pConnection);
   void Disconnect(ref EventStatusEnum adStatus, Connection pConnection);
}

Результаты PRINT не сообщаются из-за ошибок

Результат операторов PRINT не появляется в коллекции Errors после завершения T-SQL.

Что хорошо, потому что мне нужна обратная связь в режиме реального времени; не после завершения всей партии.

псевдокод

Connection conn = new Connection();
conn.ConnectionString = connectionString;
conn.Open();

//Hook up events listener
ConnectionEvents ev = new ConnectionEvents();
Integer cookie = (conn as IConnectionPointContainer).FindConnectionPoint(DIID_ConnectionEvents).Advise(ev);

//run our sql batch
conn.Execute(sql, out recordsAffected, adCmdText);

//Disconnect events
(conn as IConnectionPointContainer).FindConnectionPoint(DIID_ConnectionEvents).Unadvise(cookie);

И магия COM заключается в том, что вы создаете объект для получения всех событий:

public class ConnectionEvents: IConnectionEvents
{
   void InfoMessage(Error pError, ref EventStatusEnum, Connection, pConnection) 
   {
      Debugger.Break();
   }
   void BeginTransComplete(Integer TransactionLevel, Error pError, ref EventStatusEnum adStatus, Connection pConnection) {}
   void CommitTransComplete(Error pError, ref EventStatusEnum adStatus, Connection pConnection) {}
   void RollbackTransComplete(Error pError, ref EventStatusEnum adStatus, Connection pConnection) {}
   void WillExecute(ref string Source, ref CursorTypeEnum CursorType, ref LockTypeEnum LockType, ref Integer Options, ref EventStatusEnum adStatus, Command pCommand, _Recordset pRecordset, Connection pConnection) {}
   void ExecuteComplete(Integer RecordsAffected, Error pError, ref adStatus EventStatusEnum, Command pCommand, Recordset pRecordset, Connection pConnection) 
   {
      Debugger.Break();
   }
   void WillConnect(ref string ConnectionString, ref string UserID, ref string Password, ref Integer Options, ref EventStatusEnum adStatus, Connection pConnection) {}
   void ConnectComplete(Error pError, ref EventStatusEnum adStatus, Connection pConnection) {}
   void Disconnect(ref EventStatusEnum adStatus, Connection pConnection) {}
}

Ключевые слова поставщика SQLOLEDB

Я задавался вопросом, возможно, было ли ключевое слово ConnectionString, которое включало бы сообщения.

К счастью, вы можете задать поставщику OLEDB все ключевые слова строки подключения, которые он поддерживает. Ваш поставщик OLEDB является объектом IDataInitialize. Приведите его к IDBProperties, и вы сможете опросить его для всех свойств, которые он поддерживает:

  • Свойство установлено DBPROPSET_DBINIT

    • DBPROP_AUTH_INTEGRATED: «Интегрированная безопасность» : VT_BSTR
    • DBPROP_AUTH_PASSWORD: «Пароль» : VT_BSTR
    • DBPROP_AUTH_PERSIST_SENSITIVE_AUTHINFO: «Сохранять информацию о безопасности» : VT_BOOL
    • DBPROP_AUTH_USERID: «ID пользователя» : VT_BSTR
    • DBPROP_INIT_CATALOG: «Начальный каталог» : VT_BSTR
    • DBPROP_INIT_DATASOURCE: «Источник данных» : VT_BSTR
    • DBPROP_INIT_HWND: "Оконная ручка" : VT_I4
    • DBPROP_INIT_LCID: «Идентификатор языка» : VT_I4
    • DBPROP_INIT_PROMPT: «Подсказка» : VT_I2
    • DBPROP_INIT_PROVIDERSTRING: «Расширенные свойства» : VT_BSTR
    • DBPROP_INIT_TIMEOUT: «Время ожидания подключения» : VT_I4
    • DBPROP_INIT_GENERALTIMEOUT: «Общее время ожидания» : VT_I4
    • DBPROP_INIT_OLEDBSERVICES: "Службы OLE DB" : VT_I4
  • Свойство установлено DBPROPSET_SQLSERVERDBINIT

    • SSPROP_INIT_CURRENTLANGUAGE: «Текущий язык» : VT_BSTR
    • SSPROP_INIT_NETWORKADDRESS: "Сетевой адрес" : VT_BSTR
    • SSPROP_INIT_NETWORKLIBRARY: "Сетевая библиотека" : VT_BSTR
    • SSPROP_INIT_USEPROCFORPREP: «Процедура использования для подготовки» : VT_I4
    • SSPROP_INIT_AUTOTRANSLATE: «Автоматический перевод» : VT_BOOL
    • SSPROP_INIT_PACKETSIZE: "Размер пакета" : VT_I4
    • SSPROP_INIT_APPNAME: «Имя приложения» : VT_BSTR
    • SSPROP_INIT_WSID: «Идентификатор рабочей станции» : VT_BSTR
    • SSPROP_INIT_FILENAME: «Исходное имя файла» : VT_BSTR
    • SSPROP_INIT_ENCRYPT: «Использовать шифрование для данных» : VT_BOOL
    • SSPROP_AUTH_REPL_SERVER_NAME: «Параметр подключения имени сервера репликации» : VT_BSTR
    • SSPROP_INIT_TAGCOLUMNCOLLATION: "Тег с сортировкой столбцов, когда это возможно" : VT_BOOL

Ни одна из них не связана с включением дополнительных сообщений.

Должно быть возможно, Query Analyzer делает это.

Чтение бонусов

...