1

ADOを使用してSQLServer2005に対して(2つの)クエリを実行しようとしています。

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)

およびSQLServer2000互換バージョン:

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がそれほど惨めに失敗する原因となるこのクエリについてはどうでしょうか。


:実際には一致する行があります:

ここに画像の説明を入力してください

provider接続文字列で使用しているのはですProvider=SQLOLEDB

ボーナスチャター:

sysprocesses

  nt_username nchar(128)
  hostname    nchar(128)

両方のクエリ(ただし、一度に1つずつ)は機能します。例:

SELECT
   sp.nt_username AS NTUsername

SELECT
   sp.hostname AS HostName

仕事。両方のクエリは失敗します。

4

1 に答える 1

0

私は問題を見つけました。 これはSQLServer2005とADOの既知の問題です。

すでにそうですnt_username手動でキャストする必要がありますhostname 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()

バダビン。

SQLServer2005のバグ。

SQL Server 2008、SQL Server 2008 R2、SQLServer2012にまだ存在している可能性があります

于 2012-05-10T16:57:58.110 に答える