none
2005Express "multiple recordsets" エラー RRS feed

  • 質問

  • SQL2000 で問題なく動いていたプログラムが
    SQL2005 Express にDB移行して動かすとエラーになってしまいました。

     

    エラー内容
    ---------------------------------
    Microsoft OLE DB Provider for ODBC Drivers error '80004005'

    Transaction cannot have multiple recordsets with this cursor type. Change the cursor type, commit the transaction, or close one of the recordsets.

     

    環境
    ---------------------------------
    DB           SQL2005 Express
    プログラム ASP
    DB接続    ODBC (SQL Native Client)


    該当ソースの一部
    ---------------------------------
    ' Open Connection
    Set pubCon = Server.CreateObject("ADODB.Connection")
    pubCon.ConnectionTimeout = 180
    pubCon.CommandTimeout = 180
    pubCon.Open cstDsn, cstUid, cstPwd
    pubCon.CommandTimeout = 180

     

    ' Open Recordset
    adoSQL = "Select * from M_User "
    Set adoRS =  Server.CreateObject("ADODB.Recordset")
    adoRS.Open adoSQL, pubCon, adOpenStatic, adLockReadOnly
    adoRS.Close

     

    ' BeginTrans
    pubCon.BeginTrans

     

    ### ↑ここで落ちます ###

     

    ' Delete a record
    adoSQL = "Delete from M_User "
    pubCon.ExeCute adoSQL

    ---------------------------------

     

    pubCon.BeginTrans の前に Set adoRS = Nothing
    を書けば正常に処理されました。

     

    ですが、修正対象が膨大なので、出来ればソースに手を加えない
    形で解決したいのです。

     

    ・SQL2005Express ではトランザクション開始前に
    開いたオブジェクトはすべて開放(Closeだけでなく Nothing )
    しないといけないのでしょうか?

     

    ・ソース修正ではなく、設定(SQL Server Management Studio Express など)の変更等で
    この問題を回避できる方法、ヒントなどご存知でしたら、教えてください。
    またはDBの設定がおかしいのでしょうか?チェックすべき項目等あれば、
    アドバイスいただければ助かります。

     

    よろしくお願いいたします。


     

    2007年8月10日 13:34

回答

  • ODBC データソースを変更してみてください。SQL Native Client ではなく SQL Server (Microsoft SQL Server ODBC ドライバ) に変えてみてください。

    2007年8月10日 21:50

すべての返信

  • サーバー側設定の問題じゃないと思います。問題のエラーはこのような場合に返るものなので、上記のコードでそのエラーが返るのはおかしいな、と思います。

     

    私の環境で次の VBScript を実行しましたが、エラーにはなりませんでした。試してみてください。

     

    Code Snippet

    ' 設定
    Const adOpenStatic = 3
    Const adLockReadOnly = 1
    cstDsn = "LocalServer" ' ODBC システム DSN の名前
    cstUid = "sa"
    cstPwd = "Password!123"
    adoSQL = "Select * from tbl1"

     

    ' Open Connection
    Set pubCon = CreateObject("ADODB.Connection")
    pubCon.ConnectionTimeout = 180
    pubCon.CommandTimeout = 180
    pubCon.Open cstDsn, cstUid, cstPwd
    pubCon.CommandTimeout = 180

     

    ' Open Recordset
    Set adoRS =  CreateObject("ADODB.Recordset")
    adoRS.Open adoSQL, pubCon, adOpenStatic, adLockReadOnly
    adoRS.Close

     

    ' BeginTrans
    WScript.Echo("Begin Transaction")
    pubCon.BeginTrans

     

    '### ↑ここで落ちます ###

    ' Delete a record
    ' adoSQL = "Delete from M_User "
    ' pubCon.ExeCute adoSQL
    WScript.Echo("Transaction Begun Successfully.")

     

     

    私の実行環境は次の通りです。

    Microsoft SQL Native Client Version 09.00.3042

     

    クライアントのバージョンが重要だと思いますが、一応サーバー側のバージョンも貼っておきます。

     

    Microsoft SQL Server 2005 - 9.00.3054.00 (Intel X86)
            Mar 23 2007 16:28:52
            Copyright (c) 1988-2005 Microsoft Corporation
            Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 2)

    2007年8月10日 17:24
  • Poindexter S. さん
    ご返信、ありがとうございます。

     

    すみません、1点訂正させてください。
    落ちるのは pubCon.BeginTrans のあとではなく
    pubCon.ExeCute adoSQL の後でした。


    訂正
    -------------------------------
    ' BeginTrans
    pubCon.BeginTrans

     

    ' Delete a record
    adoSQL = "Delete from M_User "
    pubCon.ExeCute adoSQL

    ### ↑ここで落ちます ###
    -------------------------------

     

    でも、Poindexter S. さんの仰るとおり、
    エラーメッセージ変ですよね。
    このエラーメッセージで色々調べても、
    このソースのような状況で落ちるケースがまったく見つからず・・・。

     

    VBSプログラムサンプル、ありがとうございました。
    サーバ上で同じように記述して実行してみましたが、
    やはり pubCon.ExeCute adoSQL のところで
    同一エラーが出ました。

     

    また何か確認すべきこと、試してみるもの等がありましたら
    アドバイス頂けると助かります。

    2007年8月10日 18:22
  • ODBC データソースを変更してみてください。SQL Native Client ではなく SQL Server (Microsoft SQL Server ODBC ドライバ) に変えてみてください。

    2007年8月10日 21:50
  • Poindexter S. さん

    ご返信ありがとうございます。

     

    ODBCデータソースを変更してみたら、エラーなく処理が出来ました。

    アドバイスありがとうございました。助かりました。

     

    なぜ SQL Native Client では駄目なのかは勉強不足で分からないのですが、

    とりあえずシステムが動くようになったので、一安心です。

    ありがとうございました。

     

    2007年8月13日 12:44
  • "なぜ" かは私にもわかりません。なんとなく SNAC と ODBC は相性が悪そうだなと直感的に思ったので以前の ODBC ドライバならどうかなと思っただけです。

     

    SNAC を使っても ODBC を経由しなければ期待通りに動作します。

    つまり接続文字列内を次のように指定すれば SNAC でも動作します。

     

    cstDsn = "Provider=SQLNCLI.1;Persist Security Info=False;Initial Catalog=MyDB;Data Source=(local)"

     

    コードの修正が必要になるので、質問者が設定した制限にひっかかってしまいますね。

    2007年8月13日 19:06
  • 解決済みのところ、失礼します。

     

    エラー内容を見て、この記事を思い出しました。

    http://www.atmarkit.co.jp/fwin2k/operation/infopath03/infopath03_03.html

    この記事の中ほどです。

     

    SET NOCOUNT 絡みかもしれませんね。

    2007年8月15日 2:45