代码之家  ›  专栏  ›  技术社区  ›  Ian Boyd

在ADO中捕获T-SQL打印输出?

  •  1
  • Ian Boyd  · 技术社区  · 6 年前

    有没有可能捕捉到 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 ,您可以查询它支持的所有属性:

    • 属性集 DBPROPSET\u DBINIT

      • DBPROP_AUTH_INTEGRATED :
      • DBPROP_AUTH_PASSWORD
      • DBPROP_AUTH_PERSIST_SENSITIVE_AUTHINFO : “保存安全信息” :VT\u布尔
      • DBPROP_AUTH_USERID : “用户ID”
      • DBPROP_INIT_CATALOG : :VT\u BSTR
      • DBPROP_INIT_DATASOURCE : “数据源”
      • DBPROP_INIT_HWND : “窗口句柄” :VT\u I4
      • DBPROP_INIT_LCID “区域设置标识符” :VT\u I4
      • DBPROP_INIT_PROMPT “提示” :VT\u I2
      • DBPROP_INIT_PROVIDERSTRING “扩展属性” :VT\u BSTR
      • DBPROP_INIT_TIMEOUT : “连接超时” :VT\u I4
      • DBPROP_INIT_GENERALTIMEOUT :VT\u I4
      • DBPROP_INIT_OLEDBSERVICES “OLE DB服务” :VT\u I4
    • DBPROPSET\u SQLSERVERDBINIT

      • SSPROP_INIT_CURRENTLANGUAGE : “当前语言” :VT\u BSTR
      • SSPROP_INIT_NETWORKADDRESS : :VT\u BSTR
      • SSPROP_INIT_NETWORKLIBRARY “网络库” :VT\u BSTR
      • SSPROP_INIT_USEPROCFORPREP “使用准备程序” :VT\u I4
      • SSPROP_INIT_AUTOTRANSLATE : “自动翻译” :VT\u布尔
      • SSPROP_INIT_PACKETSIZE “数据包大小” :VT\u I4
      • SSPROP_INIT_APPNAME : “应用程序名称” :VT\u BSTR
      • SSPROP_INIT_WSID “工作站ID” :VT\u BSTR
      • SSPROP_INIT_FILENAME : :VT\u BSTR
      • SSPROP_INIT_ENCRYPT : “对数据使用加密” :VT\u布尔
      • SSPROP_AUTH_REPL_SERVER_NAME : “复制服务器名称连接选项” :VT\u BSTR
      • SSPROP_INIT_TAGCOLUMNCOLLATION : :VT\u布尔

    似乎与选择额外的信息没有关系。

    必须是可能的,查询分析器做到了。

    额外阅读

    0 回复  |  直到 5 年前