none
ClassicASPとSQLServerの動作 RRS feed

  • 質問

  • お世話になっております。
    
    調査に行き詰まってしまったため、ご教示願います。
    
    【環境】
    
    ・Webサーバー
     OS:WindowsServer2007 SP2
     Webサービス:IIS7
    
    ・DBサーバー
     OS:Windows2012R2
     DB:SQLServer2014 SP1(12.0.4100.1)
    
    
    【経緯】
    
    現在、ClassicASP + SQLServer2000 SP4(8.002039)の環境で動作しているシステムがあります。
    
    このシステムを、ClassicASP + SQLServer2014 SP1(12.0.4100.1)へ移行作業中です。
    
    ところが、想定の動作をしない箇所が出ました。
    
    
    【処理内容】
    (実処理ではなく、簡略化しています。)
    
    Dim Connection
    
    Set Connection = Server.CreateObject("ADODB.Connection")
    
    Connection.Open("接続文字列","ユーザー名","パスワード")
    
    Dim obj
    Dim obj2
    Dim SQL
    Dim SQL2
    
        
    'トランザクション開始
    Connection.BeginTrans
        
    'データ挿入
    
    SQL = " insert into Table_1(COL1,COL2)values(1,'aaaaaaa')"
    
    Set obj = Connection.Execute(SQL)
    
    '他の検索処理
    SQL2 = "select '1'"
    
    --①ソースの変更箇所 ここから
    Set obj2 = Server.CreateObject("ADODB.Recordset")	
    obj2.Open SQL2,Connection,2,2
    --ここまで
    
    'コミット
    Connection.CommitTrans
    
    Set obj = Nothing
    Set obj2 = Nothing
    Set Connection = Nothing
    
    ・Table_1のCREATE文
    
    CREATE TABLE [dbo].[Table_1](
    	[COL1] [int] NOT NULL,
    	[COL2] [varchar](50) NULL,
     CONSTRAINT [PK_Table_1] PRIMARY KEY CLUSTERED 
    (
    	[COL1] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    
    GO
    
    ・想定の動作(正しい目的の動作)
    
    テーブル"Table_1"に、1件データが追加される。
    
    ・現在の動作
    
    テーブル"Table_1"に、データが追加されない。
    
    ※エラーは発生していません。
      また、簡略化していない実処理では、同じトランザクション内で、
      この他のテーブルにもInsert文を発行していますが、正常に追加されます。
    
    
    【現時点で分かっていること】
    
    ①ソースの変更
    
    下記の様に変更すると、想定の正しい動作になります。
    
    --①ソースの変更箇所 ここから
    Set obj2 = Server.CreateObject("ADODB.Recordset")	
    obj2.Open SQL2,Connection,2,2
    --ここまで
    
    上記を以下のように変更
    
    --①ソースの変更箇所 ここから
    Set obj2 = Connection.Execute(SQL2)
    --ここまで
    
    
    ②データベースサーバーの設定を変更
    
    サーバーのプロパティ⇒接続⇒規定の接続オプション
    XACT ABORTのチェックをオフ
    
    
    ③同様の処理をExcel VBAに実装した場合は、想定の正しい動作になります。
    
    'ExcelVBAのソース
    
    Dim Conn As Object
    Set Conn = CreateObject("ADODB.Connection")
    
    Dim obj As Object
    
    Conn.ConnectionString = "接続文字列"
    Conn.Open
    
    'トランザクション開始
    Conn.BeginTrans
    
    'データ挿入
    Dim strSQL As String
    
    strSQL = " insert into Table_1(COL1,COL2)values(1,'aaaaaaa')"
    
    Set obj = Conn.Execute(strSQL)
    
    '他の検索処理
    strSQL = "select '1'"
    
    Dim Rs As Object
    Set Rs = CreateObject("ADODB.Recordset")
    
    Rs.Open strSQL, Conn, 2, 2
    
    'コミット
    Conn.CommitTrans
    
    
    Rs.Close
    Set Rs = Nothing
    
    Conn.Close
    Set Conn = Nothing
    
    
    
    【質問内容】
    
    1.なぜ、ソースを書き換えると、想定の正しい動作になるのか。
    
    2.XACT ABORTのチェックは、
    『Transact-SQL ステートメントで実行時エラーが発生した場合、トランザクションをロールバックします。』(ヘルプ内容)
    というものです。
    実行時エラーが発生しているということなのでしょうか。
    
    3.なぜ、ExcelVBAでは、再現しないのか。
    
    わからないことだらけで、申し訳ありませんが、よろしくお願いいたします。
    
    
    
    
    
    
    

    2017年5月11日 6:14