none
Oracle リンクサーバーへの接続およびデータ取得 RRS feed

  • 質問

  • お世話になります。

    SQL ServerからOracleへリンクサーバで接続できたのですが

    プログラムからOracleのデータが取得できません。

    どこが悪いのか教えていただけますでしょうか?

    環境
      PC-A
      Windows Vista
      Oracle 11g
      PC-B
      Windows 10 1803 x86
      SQL Server 2012 Express
        - Oracleのリンクサーバーを作成
       
     リンクサーバーの設定内容
      リンクサーバー:SVR01
      プロバイダー :Oracle Provider for OLE DB
      製品名    :ORACLE
      データソース :IPアドレス:1521/サービス
      リモートログイン:SYSTEM
      パスワード   :SYSTEMのパスワード
     以上の設定でリンクサーバーを作成しました。
     
     
     SQL Server(SSMS)で下記のクエリーを実行したレコードは取得できました。
     
        declare @CTLNO smallint = 1
        select * from OPENQUERY(SVR01,'select * from スキーマ.テーブル名') where CTLNO=@CTLNO
     
     ただし、VS2015 Expressで下記のコードを実行すると
     ①の箇所で
      「System.Data.OleDb.OleDbException(0x80040E14);ORA-00933:
       SQLコマンドが正しく終了されていません。」
     のエラーが発生しレコードを取得できません。
     
     
         Private Sub QUERY_01()
            Dim wOleCMMD As OleDbCommand = Nothing
            Dim wOleREDR As OleDbDataReader = Nothing
            Dim wCNCTSTR As String = ""
            Dim sb As New System.Text.StringBuilder("")

            Try
                wCNCTSTR = "Provider=OraOLEDB.Oracle;Data Source='192.168.xxx.xxx:1521/サービス';User ID='SYSTEM';     Password='SYSTEMのパスワード';"
                sb.Append("select * from OPENQUERY(SVR01,'select * from スキーマ.テーブル名') where CTLNO=@CTLNO;")

                Using wOleCNCT As New OleDbConnection(wCNCTSTR)
                    Using OLEcmd As New OleDbCommand(sb.ToString, wOleCNCT)
                        With OLEcmd
                            'パラメーターの設定
                            .Parameters.Add("@CTLNO", Data.OleDb.OleDbType.SmallInt)
                            .Parameters("@CTLNO").Value = 1
                            '接続
                            wOleCNCT.Open()
                            MessageBox.Show("接続成功")
                            'データを取得
                            wOleREDR = OLEcmd.ExecuteReader <-------①ここでエラー
                            If wOleREDR.HasRows = True Then
                                While wOleREDR.Read
                                    Dim wUSERID As String = OleFldGet("USERID", wOleREDR).ToString
                                    Dim wPASSWD As String = OleFldGet("PASSWORD", wOleREDR).ToString
                                End While
                            Else
                            End If
                        End With
                        '接続を閉じる
                        wOleCNCT.Close()
                    End Using
                End Using
            Catch ex As Exception
                '接続失敗
                MessageBox.Show(ex.ToString, "接続エラー")
            Finally
            End Try
        End Sub

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

    2018年8月3日 5:24

回答

  • SQLServerにOracleへのリンクサーバ設定をしたのは解りました。
    であれば、プログラムからはSqlConnectionを使ってそのSQLServerに接続して、「Oracleのリンクサーバに対するクエリ」を発行するのが筋かと思います。

    OraOledbが出てくる理由がよく解りません。それはプログラムが直接Oracleに接続するわけで、リンクサーバを設定した理由が不明になるためです。


    jzkey

    2018年8月5日 12:44

すべての返信

  • SQLServerにOracleへのリンクサーバ設定をしたのは解りました。
    であれば、プログラムからはSqlConnectionを使ってそのSQLServerに接続して、「Oracleのリンクサーバに対するクエリ」を発行するのが筋かと思います。

    OraOledbが出てくる理由がよく解りません。それはプログラムが直接Oracleに接続するわけで、リンクサーバを設定した理由が不明になるためです。


    jzkey

    2018年8月5日 12:44
  •     お世話になります。
       
        返信ありがとうございます。
       
        リンクサーバー設定時に"Oracle ProVider for OLE DB"を選択したので
        OleDbConnectionで接続する必要があると思ってました。
       
        その後,リンクサーバーを削除しても接続できたので、
        直接Oracleに接続しているのではないかと思い始めていました。
       
        そして、jzkeyさんの返信を見て,
        SqlConnectionを使ってSQL Serverに接続すればよいということで
        下記のコードで、データを取得することができました。
        ありがとうございました。
       
       
        Private Sub QUERY_02()
            '接続する端末名
            Dim wServerName As String = ""
            '接続するデータベース名
            Dim wDBName As String = ""
            'ユーザー
            Dim wUserID As String = ""
            'パスワード
            Dim wPassWd As String = ""
            Dim wSQL As String = ""
            Try
                wServerName = "XXX.XXX.XXX.XXX\SQLSERVER"
                wDBName = "TEST_DB"
                Dim wConnectionString As String = "Data Source = " & wServerName & _
                                                 ";Initial Catalog = " & wDBName &  _
                                                 ";Integrated Security = SSPI"

                wSQL = "select * from OPENQUERY(SVR01,'select * from スキーマ.テーブル名')"
                Using SQLCon As New SqlConnection(wConnectionString)
                    Dim SQLdr As SqlDataReader
                    Using SQLcmd As New SqlCommand(wSQL, SQLCon)
                        Try
                            With SQLcmd
                                .Connection = SQLCon
                                .CommandType = Data.CommandType.Text
                                '.CommandText = sb1.ToString
                                SQLCon.Open()
                                SQLdr = .ExecuteReader
                                If SQLdr.HasRows = True Then
                                    While SQLdr.Read
                                        Dim wUSERID As String = sqlRdrFldGet("USERID", SQLdr).ToString
                                    End While
                                End If
                                SQLCon.Close()
                            End With
                        Catch ex As Exception
                        End Try
                    End Using
                End Using
            Catch ex As Exception
                Console.WriteLine("Error! {0}", ex.Message)
            Finally
            End Try
        End Sub

    2018年8月6日 6:22