【问题标题】:Particular query causes ADO Recordset to fail with E_FAIL特定查询导致 ADO Recordset 失败并显示 E_FAIL
【发布时间】:2016-12-13 19:58:03
【问题描述】:

我正在尝试使用 ADO 对 SQL Server 2005 运行(两个)查询:

SELECT
   sp.nt_username AS NTUsername,
   sp.hostname AS HostName
FROM sys.dm_tran_locks tl
   INNER JOIN master.dbo.sysprocesses sp
   ON tl.request_session_id = sp.spid
WHERE tl.resource_type = N'APPLICATION'
AND tl.resource_database_id = (
       SELECT dbid
       FROM master.dbo.sysprocesses
       WHERE spid = @@spid)

和 SQL Server 2000 兼容版本:

SELECT
   sp.nt_username AS NTUsername,
   sp.hostname AS HostName
FROM master.dbo.syslockinfo sli
   INNER JOIN master.dbo.sysprocesses sp
   ON sli.req_spid = sp.spid
WHERE rsc_type = 10 --10=Appliction
AND rsc_dbid = (
   SELECT dbid
   FROM master.dbo.sysprocesses
   WHERE spid = @@spid)

查询执行很好:

IRecordset rs =new Recordset();
rs.CursorLocation = adUseClient; //the default for a Recordset is adUseServer (Connection.Execute's default is adUseClient)
rs.CursorType := adOpenForwardOnly; //the default
rs.Open(szQuery, conn.ConnectionObject,
       adOpenForwardOnly, //CursorType
       adLockReadOnly, //LockType
       adCmdText);

然后检查BOFEOF的状态:

if (rs.EOF) then

触发异常:

  • HRESULT: 0x80004005(未指定的错误)
  • 错误消息:“数据提供者或其他服务返回了 E_FAIL 状态”

这个导致 ADO 如此惨败的查询是怎么回事?


注意:确实有匹配行:

我在连接字符串中使用的providerProvider=SQLOLEDB

奖金聊天:

系统进程

  nt_username nchar(128)
  hostname    nchar(128)

并查询两者 - 但一次一个 - 有效,例如:

SELECT
   sp.nt_username AS NTUsername

SELECT
   sp.hostname AS HostName

工作。查询两者均失败。

【问题讨论】:

    标签: sql-server-2005 ado recordset


    【解决方案1】:

    我发现了问题。 It's a known issue with SQL Server 2005 and ADO:

    即使nt_usernamehostname 已经 nchar(128),您仍需要手动将它们转换为nchar(128)

    SELECT
       CAST(sp.nt_username AS nchar(128)) AS NTUsername,
       CAST(sp.hostname AS nchar(128)) AS HostName
    FROM sys.dm_tran_locks tl
       INNER JOIN master.dbo.sysprocesses sp
       ON tl.request_session_id = sp.spid
    WHERE tl.resource_type = N'APPLICATION'
    AND tl.resource_database_id = (
           SELECT dbid
           FROM master.dbo.sysprocesses
           WHERE spid = @@spid)
    

    SQL Server 2005 和 ADO 以及在查询中使用 @@spid 也存在一个已知错误;你做不到。幸运的是,在这种情况下,我可以使用DB_ID()

    SELECT
       CAST(sp.nt_username AS nchar(128)) AS NTUsername,
       CAST(sp.hostname AS nchar(128)) AS HostName
    FROM sys.dm_tran_locks tl
       INNER JOIN master.dbo.sysprocesses sp
       ON tl.request_session_id = sp.spid
    WHERE tl.resource_type = N'APPLICATION'
    AND tl.resource_database_id = DB_ID()
    

    八大兵。

    SQL Server 2005 错误。

    它可能仍然存在于 SQL Server 2008、SQL Server 2008 R2、SQL Server 2012 中

    【讨论】:

      猜你喜欢
      • 2020-09-04
      • 1970-01-01
      • 1970-01-01
      • 2021-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多