Можно ли захватить 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
, и вы сможете опросить его для всех свойств, которые он поддерживает:
Ни одна из них не связана с включением дополнительных сообщений.
Должно быть возможно, Query Analyzer делает это.
Чтение бонусов