是否在ADO中捕获T-SQL PRINT输出?

时间:2018-10-30 18:40:03

标签: sql-server windows winapi ado

是否可以在ADO中从T-SQL捕获PRINT输出?

例如:

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);
}

未通过错误报告打印结果

在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) {}
}

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“工作站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

似乎与选择加入其他邮件无关。

查询分析器必须做到这一点。

奖金阅读

0 个答案:

没有答案