• 締切済み

SQLServer 分散トランザクションについて

現在サーババージョンアップに伴うストアドの動作検証を行っています。 内容としては2000で動作していたものを2008R2に移行するだけです。 そこでひとつ問題が発生して作業がとまってしまいましたので、 お力を借りたく、質問させていただきます。 環境としては、クライアントはACCESSプログラム、DBはSQLServerとなっています。 ストアドの実行で下記のように記載していたプログラムが動作しなくなりました。 Set adoCN = New ADODB.Connection adoCN.Open CurrentProject.Connection adoCN.BeginTrans adoCN.Execute "exec dbo.実行ストアド" 'エラー判定 adoCN.CommitTrans 上記エラー判定で「リンク サーバー "(null)" の OLE DB プロバイダー "SQLNCLI10" から、 メッセージ "アクティブなトランザクションがありません。" が返されました。」 となってしまいます。 また、このストアド内では「SET XACT_ABORT ON ~ SET XACT_ABORT OFF」 としてあります。 ちなみに、上記「adoCN.BeginTrans」、「adoCN.CommitTrans」をコメントすると、 正常に動作しました。 「SET XACT_ABORT ON」としているので「adoCN.BeginTrans」はなくてもいいと思うのですが、 明確に『不要である』としている文献等、見つからなかったため、迷っています。 サーバはバージョンアップに伴い、分散トランザクションを使用するようになっていますが、 この変更が影響しているのかどうか、まったく別の原因なのか、わからない状態です。 うまく伝わっているか心配ですが、どうぞ宜しくお願い致します。

みんなの回答

  • Siegrune
  • ベストアンサー率35% (316/895)
回答No.1

>「SET XACT_ABORT ON」としているので「adoCN.BeginTrans」はなくてもいいと思うのですが Set adoCN = New ADODB.Connection adoCN.Open CurrentProject.Connection adoCN.BeginTrans adoCN.Execute "exec dbo.実行ストアド" insert into アクセスのテーブル values(1) 'エラー判定 adoCN.CommitTrans とかだと、 adoCN.BeginTransとadoCN.CommitTransはなくては困るはず。 (アクセスのテーブルへのinsertがストアドの結果に関係なく実行されるから。) ということで >明確に『不要である』としている文献等、見つからなかったため は見つからないと思います。 ストアドプロシジャ内のどの命令でエラーがでているのかが不明なので (⇒これを特定するのが先のように思いますが) はっきりしたことはわかりませんが、 >このストアド内では「SET XACT_ABORT ON ~ SET XACT_ABORT OFF」としてあります のほうが問題なのでは? ## SET XACT_ABORT ONなんて気持ち悪くて使う気にならないので使ったことはないので ## 良く分かりませんが クライアントのadoのトランザクションの中で、突然、sqlserverにトランザクション制御を 任せるような命令を出したらなにかおかしくなるようにしか思えないです。 SET XACT_ABORT ON ~ SET XACT_ABORT OFF を Begin Transaction ~ Commit にしてエラー制御をきちんと書いて、エラーならロールバックするようにしてみたら? と思います。 (SQL Serverはトランザクションの入れ子がOKだったはずなのでbegin transactionを  書いても大丈夫だったと思いますが、ダメならストアド側でトランザクション制御はしないとか。) ## 的外れだったらごめんなさいね。

ipsum11
質問者

お礼

返信が遅れてすみませんでした。 処理をご回答いただいた「Begin Transaction ~ Commit」に変更し、 無事に解決できました。 ありがとうございました。

関連するQ&A

  • asp+dllでのcommitの有効範囲

    aspでトランザクション(BeginTrans、CommitTrans)を定義し、 そのトランザクション内でDB更新機能を持ったdllを使用したとします。 この時、dllでDB更新エラー時DBに対しロールバッグはかけることは可能 でしょうか  asp  BeginTrans  dllを呼ぶ  dllが不正終了時、aspを終了する  CommitTrans  dll   DBを更新(DLL内ではbegintran、committranはしない) もちろんDLLはサーバー内で動かします。 DBはsql server、DLLはvb6.0で作成します。 どうかお力添えを、、、

  • ストアドプロシージャの処理終了を判定

    OS:windowsXP Pro Access Version:ACCESS2000 AccessVBAでストアドプロシージャを呼び出し処理をしていますが、ストアドプロシージャでの処理終了を判定して、次のステップに移るような処理を考えています。 SQLServerには、ODBC経由で接続しています。 ストアドプロシージャの呼び出しは巧く行くのですが、処理終了が判定できません。 具体的にはどうすればストアドプロシージャの処理の終了を判定することができるのでしょうか?      Dim adoCN As ADODB.Connection Dim str_adoCN As String Dim strCommand As ADODB.Command Dim RS As New ADODB.Recordset str_adoCN = "Data Source='SQL_XXXX'; User ID='XX';Password='XXXXXXXX';" Set adoCN = New ADODB.Connection adoCN.Open str_adoCN Set strCommand = New ADODB.Command Set strCommand.ActiveConnection = adoCN strCommand.CommandText = "Procedure_XXXX" strCommand.CommandType = adCmdStoredProc Set RS = strCommand.Execute() 次の処理....

  • 分散トランザクションを開始できなかった

    [OSのVER]:2003server 同士 [SQLServerのVER]:SQLServer2000 StandardEdition SP3 はじめまして! 前のログ(http://www7.big.or.jp/~pinball/discus/sqls/26278.html)で でていたエラーメッセージ サーバー : メッセージ 7391、レベル 16、状態 1、プロシージャ [Microsoft][ODBC SQL Server Driver][SQL Server]OLE DB プロバイダ 'SQLOLEDB' は分散トランザクションを開始できなかったので、要求した操作は実行されませんでした。 [OLE/DB provider returned message: 指定されたトランザクション コーディネータに、新規トランザクションを参加できませんでした。] OLE DB エラー トレース [OLE/DB Provider 'SQLOLEDB' ITransactionJoin::JoinTransaction returned 0x8004d00a]。 と表示されます ビューや、MSDTC(http://support.microsoft.com/?scid=kb;ja;329332&spid=2852&sid=global) などすべてやってみましたがだめでした Enterprise Managerでリンクサーバーを設定して中身を確認する事もできました ビューでその別サーバーのDBを覗くこともできます ストアドでカーソルを使用しています DECLARE M_USER_CSR CURSOR FOR SELECT INPDATE FROM [別サーバ名].DB.dbo.xxxxxx WHERE INPDATE = @COMP_DATE -- システム更新日付比較 と、定義して FETCH NEXT FROM M_USER_CSR としたところで、エラーが表示されます 最初のフェッチではエラーがでず(一件目は正常に内容を取得してます) 二件目のフェッチでエラーがでます どのような解決方法がございますか? どうか教えてください よろしくお願いします ps:サーバー同士はドメイン管理されていません    ワークグループ管理のもと互いに信頼関係は結んでおります

  • 手動または分散トランザクションモード…のエラー

      お世話になります。 開発言語:VisualBasic 6 sp6 OS :WindowsXP Pro sp3 DB :Microsoft SQL Server 2005 以下のコードはCommand1ボタンをクリックした時に実行される処理です。 処理内容は、テーブルAを読み、テーブルAの全てのレコードを順次読みながら テーブルBを検索し、テーブルBの"keyname"をprintします。 ※実際のプログラムではテーブルAを順次読むループの中で多数のテーブルへの  新規レコード追加、更新などを行っております。 Private Sub Command1_Click()   Dim objConn   As ADODB.Connection   Dim objRsA   As ADODB.Recordset   Dim objRsB   As ADODB.Recordset   Dim sSQL   As String   Set objConn = New ADODB.Connection   objConn.ConnectionString = cstrCon   objConn.Open   Set objRsA = New ADODB.Recordset   Set objRsB = New ADODB.Recordset   'トランザクション開始   objConn.BeginTrans   sSQL = "select * from テーブルA"   objRsA.Open strSQL, objConn   If objRsA.EOF = False Then     Do Until objRsA.EOF       sSQL = "select * from テーブルB where key = " & objRsA.Fields("key")       objRsB.Open strSQL, objConn    '←この行でエラー発生       Print objRsB.Fields("keyname").Value       objRsB.Close       objRsA.MoveNext     Loop   End If   objRsA.Close   'コミット   objConn.CommitTrans End Sub ↑の処理を実行すると「objRsB.Open strSQL, objConn」の行で以下の実行エラーになります。 "手動または分散トランザクションモードのため、新規接続を作成できません。" このエラーの原因が分からず自分でもいろいろ調べてみました。 以下のサイトも何度も見直してみましたがよく理解できませんでした。 http://support.microsoft.com/kb/234218/ja どこが間違っていて、どこを修正すればエラーが出なくなるのでしょうか? よろしくお願い致します。  

  • エクセルVBA_ADO「ファイアホースモードの間はトランザクションを開

    エクセルVBA_ADO「ファイアホースモードの間はトランザクションを開始できない」 最近、エクセルVBAからSQLサーバーを編集するプログラムの勉強をはじめ、以下のサイトを読みながらテストプログラムを走らせています。 http://www.happy2-island.com/access/gogo03/capter00306.shtml そして、以下のようなコードを走らせて見ると、「ファイアホースモードの間はトランザクションを開始できません」とのエラーが出ます。 コードを以下に記します((2)トランザクションを開始します←ここで上記のエラーが出ます) Sub prcAdoSQLServerDB() Dim adoCON As New ADODB.Connection Dim adoRS As ADODB.Recordset '(1)ADOを使いSQL ServerのDBを開きます adoCON.Open "Driver={SQL Server};" & _ "server=aaa\db; database=a1; uid=a; pwd=a;" 'レコードセットの作成(SELECT文の実行) Set adoRS = adoCON.Execute("select * from 明細") 'レコード追加のSQLを定義(フィールド名省略すると、nullを入れようとする) strsql = "INSERT INTO 詳細 (得意先コード) Values(000010)" '(2)トランザクションを開始します adoCON.BeginTrans '(3)レコード追加のSQLを実行します adoCON.Execute strsql '(4)SQL実行結果の判定 If Err.Number = 0 Then '(5)SQLが正常終了したら追加を反映します adoCON.CommitTrans Else '(6)SQLが異常終了したら追加の破棄とエラー内容の表示をします adoCON.RollbackTrans End If End Sub 何が原因なのでしょうか。

  • SQLServerへの接続子による違いについて

    VB2005 Express SQLServer2003で開発している初心者です。 ループをし、その中でDBへの登録を行いたいと思い、下記のようにコーディング しましたところ、2回目で下記のエラーになりました。 このカーソルの種類を使用している場合は、トランザクションに複数の Recordset を含むことはできません。カーソルの種類を変更する、トランザクションをコミットする、または Recordset のいずれかを閉じてください。 自分なりに調べて、接続文字列を変数Bにしたところ、エラーが発生しなくなりました。 どうして変数Aだとエラーで、変数Bだとエラーにならないのでしょうか。 すみませんが、どなたかご教授下さい。宜しくお願いします。 変数A="DRIVER=SQL Server;UID=aaa;DATABASE=ccc;Password=bbb;SERVER=ddd" 変数B="Provider=SQLOLEDB.1;Password=bbb;Persist Security Info=True;User ID=aaa;Initial Catalog=ccc;Data Source=ddd" Dim cn As New ADODB.Connection cn.Open(変数A) cn.BeginTrans() For intCnt = 0 To intRow - 1  SQL文作成  cn.Execute(作成したSQL文) Next cn.CommitTrans()

  • AccessVBA トランザクション処理について。

    AccessVBAにてコードを作成する際に、 下記トランザクション処理のコードを書くとデータ喪失予防になると 聞きました。(エラーが起きたときには、処理前に戻ると。) この処理は、delete~insertのような処理でないと有効にならないのでしょうか?どんな処理でも有効ですか? Dim Wrk As workspace Dim blnFlag As Boolean Set Wrk = DBEngine.Workspaces(0) Wrk.BeginTrans blnFlag = True ***************************** delete ~insert (update) ***************************** Wrk.CommitTrans blnFlag = False Set Wrk = Nothing Err: If blnFlag = True Then Wrk.Rollback End If

  • トランザクションの肥大化

    Windows2003+SQL-Server2005でシステムを構築しておりますが、トランザクションログの肥大化に悩んでおります。 ファイルサイズが80Gb(空き容量88%)のDataBseを完全Backupすると300Gbを超えるサイズとなってしまいます。 トランザクションファイルのサイズが300Gbを超えておりますので、これが原因だと考えておりますが、定期的にトランザクションのBackupを実施しても全く(トランザクションFの)空き容量が減りません。 復旧モードを単純に変更してみたのですが、状況は変わらずトランザクションファイルがじりじり肥大化しています。 他のDBとのレプリケーションを実施しており、パブリッシャ側でDBの再構築を実施すると一気にトランザクションのサイズが増加するので、レプリケーションの設定を見直しておりますが、問題点を発見する事ができない状態です。 レプリケーションを含めDB動作には全く問題がないのですが、このままの状態では遠からずDisk容量不足が発生してしまいます。 何かお心当たりがございましたら是非ご教授頂きたく、よろしくお願い致します。

  • ADO Connection を再利用する方法

    【環境】 OS:Windows Server 2003 DB:SQL Server 2005 言語:VB .NET 2005 現在、Windows2000Server + SQLServer2000 + VB6の環境を 上記の環境に移行しております。 ADO Connectionの再利用で 「手動または分散トランザクションモードのため、新規接続を作成できません」 というエラーが発生します。 いろいろと検索してみたのですが、解決せず、お力をお貸しいただきたいと思って投稿させていただきます。 現在のコードは、 -------------------------------------------- Public adoCn As ADODB.Connection Public adoRs As ADODB.Recordset Public Sub pfAutoClosed()  If fGet印刷ジャーナルファイルRecordset() = True Then    '*********************    'トランザクションの開始    '*********************    adoCn.BeginTrans()    '印刷ジャーナルファイルのロック    sMySQL = "SELECT * FROM 印刷ジャーナルファイル WITH (TABLOCKX)"    adoCn.Execute(sMySQL, , ADODB.CommandTypeEnum.adCmdText)    '職員表マスタのロック    sMySQL = "SELECT * FROM 職員表マスタ WITH (TABLOCKX)"    adoCn.Execute(sMySQL, , ADODB.CommandTypeEnum.adCmdText) <---- ここでエラー発生    adoRs.MoveFirst()    Do Until adoRs.EOF      iKubun = nz(adoRs.Fields("区分").Value)      '*****************      '1.職員表マスタの作成      '*****************      'SQLステートメントを作成      sMySQL = "INSERT INTO 職員表マスタ (~以下省略)"      adoCn.Execute(sMySQL, , ADODB.CommandTypeEnum.adCmdText)      '**************************      '2.更新区分に更新フラグを設定      '**************************      sMySQL = "UPDATE 印刷ジャーナルファイル " & "SET 更新区分 = 1 (~以下省略)"      adoCn.Execute(sMySQL, , ADODB.CommandTypeEnum.adCmdText)      adoRs.MoveNext()    Loop    adoCn.CommitTrans() 'トランザクション処理のコミット    adoRs.Close()    adoRs = Nothing  endif End Sub '***************************************** '印刷ジャーナルファイルのレコードセットを取得 '***************************************** Private Function fGet印刷ジャーナルファイルRecordset() As Boolean   adoRs = New ADODB.Recordset   With adoRs     .let_Source("SELECT * FROM 印刷ジャーナルファイル " & "WHERE 発行区分 = 1 AND 更新区分 = 0")     .let_ActiveConnection(adoCn)     .CursorType = ADODB.CursorTypeEnum.adOpenKeyset     .LockType = ADODB.LockTypeEnum.adLockPessimistic     .Open()   End With   If adoRs.EOF Then     fGet印刷ジャーナルファイルRecordset = False   Else     fGet印刷ジャーナルファイルRecordset = True   End If End Function -------------------------------------------- となっています。 pfAutoClosed関数内で、同じadoCnを使用しての2度目のSELECT文が実行できません。 ADO Connectionの再利用ができないということで、「Close」をしてくださいという記述を参考にもしたのですが、解決しておりません。 トランザクション開始位置も変更してみたのですが、だめでした。 VB->VB.NETへのアップグレードウィザードを使用したのですが、移行以前のVB6のバージョンではエラーなく動作します。 間違っている点をご指南いただければと思います。 よろしくお願いいたします。

  • (Windows7)VB6でODBC接続エラー

    動作環境 OS:Windows7(64bit) DB:SQL2008 Express(SP1) VB6ランタイム適用済 お世話になります。 自作のVB6EXEをWindows7で実行したところ、下記のエラーが発生してしまいます。 ErrNo:-2147168242 メッセージ:アクティブなトランザクションがありません。 ソース上のどこで発生しているのか調べたところDBのCommit時に発生 していました。 ソース:  BeginTrans  Insert文  CommitTrans  ←ここでエラー エラーにはなるのですが、Insert文の内容はDBに反映されます。 また、BeginTrans、CommitTransを使用せず、Update、Insertのみを実行した 場合はエラーは発生しません。(DBにも値が登録されます) 現状、RollbackTransができない状態です。 以下は試してみたがダメだった内容です。  ・XPやVistaでは正常に動作していたので、互換モードをVistaに設定して実行  ・Windows7(32bit)で実行 調べていて、ODBCはデフォルトで自動コミットするという記載を見かけたのですが、 DB接続時に何かしらプロパティの設定が必要なのでしょうか? 上記エラーの回避策をご存知の方がいらっしゃいましたら、ご教授願います。