是否可以在ADO中从T-SQL捕获PRINT输出?
例如:
PRINT 'Before the thing'
SELECT * FROM sys.tables
PRINT 'After the thing'
在ADO中是否可以接收这些PRINT消息?
我尝试连接到InfoMessage事件,但从未触发过。 (尽管ExecuteComplete是;很好)
为方便起见,以下是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);
}
在T-SQL完成之后,PRINT语句的结果不会出现在Errors集合中。
哪个好,因为我需要实时的反馈;不是在整个批次完成之后。
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) {}
}
我想知道是否有一个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
:“工作站ID” :VT_BSTR SSPROP_INIT_FILENAME
:“初始文件名” :VT_BSTR SSPROP_INIT_ENCRYPT
:“对数据使用加密” :VT_BOOL SSPROP_AUTH_REPL_SERVER_NAME
:“复制服务器名称连接选项” :VT_BSTR SSPROP_INIT_TAGCOLUMNCOLLATION
:“可能时使用列排序规则进行标记” :VT_BOOL 似乎与选择加入其他邮件无关。
查询分析器必须做到这一点。