有没有可能捕捉到
PRINT
例如:
PRINT 'Before the thing'
SELECT * FROM sys.tables
PRINT 'After the thing'
在ADO中是否可以接收这些打印消息?
我试着连接到
InfoMessage
事件,但从不触发。(尽管
ExecuteComplete
连接事件
为方便起见,以下是ADO连接对象公开的所有事件:
[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);
}
打印语句的结果不会显示在
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
,您可以查询它支持的所有属性:
似乎与选择额外的信息没有关系。
必须是可能的,查询分析器做到了。
额外阅读