DOBON.NET DOBON.NETプログラミング掲示板過去ログ

テーブルのリンク

  • 題名: テーブルのリンク
  • 著者: 未熟者
  • 日時: 2009/09/29 13:51:56
  • ID: 25451
  • この記事の返信元:
    • (なし)
  • この記事への返信:
  • ツリーを表示
環境/言語:[WindowsXP、VB.NET]
分類:[.NET]

こんにちは

現在、異なるDBのテーブルをリンクさせ
データを抽出しようとおもっています。
しかし、DBが違うせいなのか"テーブルが存在しません"というエラーが返って
きてしまいます。
どういう書き方をすればいいのかが分からなくなっています。
何方かご教授の程、宜しくお願い致します。

すみませんが、ご確認お願いします。


環境=oracle
開発言語=VB.NET

DB名=hogeA…テーブル名=hoge_AA
DB名=hogeB…テーブル名=hoge_BB

'A用DB接続
If Aobj.A_connect = False Then Exit Sub⇒@
'B用DB接続
If Bobj.B_connect = False Then Exit Sub⇒A


sqldata = "SELECT B.MON FROM hoge_AA A,hoge_BB B " & _
"WHERE A.FRI = B.FRI " & _
"GROUP BY B.MON"
dtTbl = Aobj.A_reader(sqldata, "get").Tables("get")⇒Bへ
    ↑
    この文でエラーが返ってきます。



@---------------------------------------------------------------------------------------
Public Function A_connect() As Boolean

A_connect = True

'Microsoft OLE DB Provider for Oracle
AConnection = New OleDb.OleDbConnection

'###ConnectionStirng(テスト用)###
AConnection.ConnectionString = "Provider = *****;Password=*****;User ID=*****;Data Source=*****;Persist Security Info=False"

Try
'DB接続処理
AConnection.Open()

Catch ex As Exception
'例外処理
MsgBox(Err.Number & ":" & Err.Description, MsgBoxStyle.Critical, "A_connect")
A_connect = False
End Try

Return A_connect

End Function




A---------------------------------------------------------------------------------------
Public Function B_connect() As Boolean

B_connect = True

'Microsoft OLE DB Provider for Oracle
BConnection = New OleDb.OleDbConnection

'###ConnectionStirng(テスト用)###
BConnection.ConnectionString = "Provider = *****;Password=*****;User ID=*****;Data Source=*****;Persist Security Info=False"

Try
'DB接続処理
BConnection.Open()

Catch ex As Exception
'例外処理
MsgBox(Err.Number & ":" & Err.Description, MsgBoxStyle.Critical, "B_connect")
B_connect = False
End Try

Return B_connect

End Function




B---------------------------------------------------------------------------------------
Public Function A_reader(ByVal sqldata As String, ByVal dsname As String) As DataSet

Dim dtSet As DataSet = New DataSet(dsname)

AAdp = New OleDb.OleDbDataAdapter(sqldata, AConnection)

Try
'SQL実行
AAdp.Fill(dtSet, dsname)

Catch ex As Exception
'例外処理実行
MsgBox(ex.Message, MsgBoxStyle.Critical, "A_reader")
End Try

A_reader = dtSet
AAdp.Dispose()
AAdp = Nothing
dtSet.Dispose()
dtSet = Nothing

'検索結果データ返還
Return A_reader

End Function
■No25451に返信(未熟者さんの記事)
> しかし、DBが違うせいなのか"テーブルが存在しません"というエラーが返って
> きてしまいます。
> どういう書き方をすればいいのかが分からなくなっています。

Oracle の『データベースリンク』機能について調べてみると、
道が開けるかと思います。
■No25452に返信(魔界の仮面弁士さんの記事)
> ■No25451に返信(未熟者さんの記事)
>>しかし、DBが違うせいなのか"テーブルが存在しません"というエラーが返って
>>きてしまいます。
>>どういう書き方をすればいいのかが分からなくなっています。
>
> Oracle の『データベースリンク』機能について調べてみると、
> 道が開けるかと思います。


ご返信有難うございます。
データベースリンク機能ですか〜、、、
昨日からいろいろと調べてるんですが、なかなか手強いですね。
■No25458に返信(未熟者さんの記事)
> ■No25452に返信(魔界の仮面弁士さんの記事)
>>■No25451に返信(未熟者さんの記事)
> >>しかし、DBが違うせいなのか"テーブルが存在しません"というエラーが返って
> >>きてしまいます。
> >>どういう書き方をすればいいのかが分からなくなっています。
>>
>>Oracle の『データベースリンク』機能について調べてみると、
>>道が開けるかと思います。
>
>
> ご返信有難うございます。
> データベースリンク機能ですか〜、、、
> 昨日からいろいろと調べてるんですが、なかなか手強いですね。


質問です。
'A用DB接続
If Aobj.A_connect = False Then Exit Sub⇒@
'B用DB接続
If Bobj.B_connect = False Then Exit Sub⇒A


sqldata = "SELECT B.MON FROM hoge_AA A,hoge_BB B " & _
"WHERE A.FRI = B.FRI " & _
"GROUP BY B.MON"
dtTbl = Aobj.A_reader(sqldata, "get").Tables("get")

上記の処理を実行する為には、絶対にDBリンクをする方法をとらないと
駄目なんですよね?
2009/09/30(Wed) 12:05:52 編集(投稿者)

■No25461に返信(未熟者さんの記事)
> 上記の処理を実行する為には、絶対にDBリンクをする方法をとらないと
> 駄目なんですよね?
DBリンク というのは、先述のデータベースリンクの事を指しているのですね?


接続を 2 本にする場合、その接続を管理しているのはクライアント側です。
サーバー側では預かり知らぬ事ですから、SQL では処理できません。ただし、
DataSet 等に データを蓄えてから、それらを LINQ to DataSet で処理したり、
http://msdn.microsoft.com/ja-jp/library/bb669071.aspx
あるいは 2 つのDataTable の各行をループ処理で付き合わせていく事で、
同じ結果を得る事ができるかと思います。

一方、どうしても SQL で処理したいのであれば、接続は 1 本にしておき、
その Oracle サーバーが、さらに他の Oracle を参照するようにすれば OK です。
そして、それを実現する方法が、先の「データベースリンク」というわけです。
これは予め、"CREATE DABASE LINK 〜" などで用意しておく事になります。
# プライベート データベースリンクにするか、それとも
# パブリック データベースリンクにするかはお好みで。

データベースリンクも使えないのであれば、JET の ODBC リンクテーブルや
ODBCDirect 接続、あるいは SQL Server の リンクサーバー機能などといった、
異種データ間クエリを発行可能なプロバイダを経由させるといった方法もあります。
この場合にも、Oracle 同士を直接繋ぐような SQL を発行する事ができるでしょう。
(ただし Oracle 専用の SQL 構文は使えず、そのプロバイダ用の SQL 構文となります)
■No25463に返信(魔界の仮面弁士さんの記事)
> 2009/09/30(Wed) 12:05:52 編集(投稿者)
>
> そして、それを実現する方法が、先の「データベースリンク」というわけです。
> これは予め、"CREATE DABASE LINK 〜" などで用意しておく事になります。
> # プライベート データベースリンクにするか、それとも
> # パブリック データベースリンクにするかはお好みで。
>

魔界の仮面弁士さんご返信有難うございます。
自分なり調べてデータベースリンクを作成することができました。
が、その後に問題がでてきました。


@では繋がるのですが、Aでは”コマンド処理中に1つ以上のエラーが発生されました”
というアラートがでてきます。
間違ってる所はないと思うのですが、一度ご確認していただけないでしょうか。
また、間違いがあればご指摘をお願いします。

すみませんが、宜しくお願いします。


DB名=hogeA…テーブル名=hoge_AA
DB名=hogeB…テーブル名=hoge_BB

@---------------------------------------------------------------------------------------
sqldata = "SELECT MON " & _
"FROM hoge_BB @*****.CO.JP"
dtTbl = Aobj.A_reader(sqldata, "get").Tables("get")⇒Bへ


A---------------------------------------------------------------------------------------
sqldata = "SELECT B.MON " & _
"FROM hoge_AA A," & _
"hoge_BB B @*****.CO.JP " & _
"WHERE A.FRI = B.FRI " & _
"GROUP BY B.MON"
dtTbl = Aobj.A_reader(sqldata, "get").Tables("get")⇒Bへ



B---------------------------------------------------------------------------------------
Public Function A_reader(ByVal sqldata As String, ByVal dsname As String) As DataSet

Dim dtSet As DataSet = New DataSet(dsname)

AAdp = New OleDb.OleDbDataAdapter(sqldata, AConnection)

Try
'SQL実行
AAdp.Fill(dtSet, dsname)

Catch ex As Exception
'例外処理実行
MsgBox(ex.Message, MsgBoxStyle.Critical, "A_reader")
End Try

A_reader = dtSet
AAdp.Dispose()
AAdp = Nothing
dtSet.Dispose()
dtSet = Nothing

'検索結果データ返還
Return A_reader

End Function
■No25466に返信(未熟者さんの記事)
> ■No25463に返信(魔界の仮面弁士さんの記事)
>>2009/09/30(Wed) 12:05:52 編集(投稿者)
>>
>>そして、それを実現する方法が、先の「データベースリンク」というわけです。
>>これは予め、"CREATE DABASE LINK 〜" などで用意しておく事になります。
>># プライベート データベースリンクにするか、それとも
>># パブリック データベースリンクにするかはお好みで。
>>
>
> 魔界の仮面弁士さんご返信有難うございます。
> 自分なり調べてデータベースリンクを作成することができました。
> が、その後に問題がでてきました。
>
>
> @では繋がるのですが、Aでは”コマンド処理中に1つ以上のエラーが発生されました”
> というアラートがでてきます。
> 間違ってる所はないと思うのですが、一度ご確認していただけないでしょうか。
> また、間違いがあればご指摘をお願いします。
>
> すみませんが、宜しくお願いします。
>
>
> DB名=hogeA…テーブル名=hoge_AA
> DB名=hogeB…テーブル名=hoge_BB
>
> @---------------------------------------------------------------------------------------
> sqldata = "SELECT MON " & _
> "FROM hoge_BB @*****.CO.JP"
> dtTbl = Aobj.A_reader(sqldata, "get").Tables("get")⇒Bへ
>
>
> A---------------------------------------------------------------------------------------
> sqldata = "SELECT B.MON " & _
> "FROM hoge_AA A," & _
> "hoge_BB B @*****.CO.JP " & _
> "WHERE A.FRI = B.FRI " & _
> "GROUP BY B.MON"
> dtTbl = Aobj.A_reader(sqldata, "get").Tables("get")⇒Bへ
>
>
>
> B---------------------------------------------------------------------------------------
> Public Function A_reader(ByVal sqldata As String, ByVal dsname As String) As DataSet
>
> Dim dtSet As DataSet = New DataSet(dsname)
>
> AAdp = New OleDb.OleDbDataAdapter(sqldata, AConnection)
>
> Try
> 'SQL実行
> AAdp.Fill(dtSet, dsname)
>
> Catch ex As Exception
> '例外処理実行
> MsgBox(ex.Message, MsgBoxStyle.Critical, "A_reader")
> End Try
>
> A_reader = dtSet
> AAdp.Dispose()
> AAdp = Nothing
> dtSet.Dispose()
> dtSet = Nothing
>
> '検索結果データ返還
> Return A_reader
>
> End Function
>

僕のやり方は全く違うんでしょうか?
何方かご教授願います。
  • 題名: Re[7]: テーブルのリンク
  • 著者: sodane-matigatterukamosirenaikeredo
  • 日時: 2009/10/02 15:36:50
  • ID: 25487
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
■No25486に返信(未熟者さんの記事)
> ■No25466に返信(未熟者さんの記事)
>>■No25463に返信(魔界の仮面弁士さんの記事)
> >>2009/09/30(Wed) 12:05:52 編集(投稿者)
> >>
> 僕のやり方は全く違うんでしょうか?
> 何方かご教授願います。
>
>

SQLをよく見てください。

>>sqldata = "SELECT B.MON " & _
>> "FROM hoge_AA A," & _
>> "hoge_BB B @*****.CO.JP " & _
>> "WHERE A.FRI = B.FRI " & _
>> "GROUP BY B.MON"

>> "GROUP BY B.MON"
>> "GROUP BY B.MON"
>> "GROUP BY B.MON"


なんでGROUP BY B.MONしてるの?
■No25466に返信(未熟者さんの記事)
> 間違ってる所はないと思うのですが、一度ご確認していただけないでしょうか。

確認していませんが、FROM 句のテーブル指定は、
 tableName aliasName @ LinkName
ではなく、
 tableName@LinkName aliasName
ではないかな…?
■No25488に返信(魔界の仮面弁士さんの記事)
> ■No25466に返信(未熟者さんの記事)
>>間違ってる所はないと思うのですが、一度ご確認していただけないでしょうか。
>
> 確認していませんが、FROM 句のテーブル指定は、
>  tableName aliasName @ LinkName
> ではなく、
>  tableName@LinkName aliasName
> ではないかな…?

GROUP関数が無いのにGROUP区を利用しているからエラーになっているのだと思うのですが・・・
■No25489に返信(sodane-matigatterukamosirenaikeredoさんの記事)
> GROUP関数が無いのにGROUP区を利用しているからエラーになっているのだと思うのですが・・・
それは大丈夫でしょう。
 SELECT COL1 FROM TABLE1 GROUP BY COL1
は、単に
 SELECT DISTINCT COL1 FROM TABLE1
と解釈されるだけでしょうから。
■No25490に返信(魔界の仮面弁士さんの記事)
> ■No25489に返信(sodane-matigatterukamosirenaikeredoさんの記事)
>>GROUP関数が無いのにGROUP区を利用しているからエラーになっているのだと思うのですが・・・
> それは大丈夫でしょう。
>  SELECT COL1 FROM TABLE1 GROUP BY COL1
> は、単に
>  SELECT DISTINCT COL1 FROM TABLE1
> と解釈されるだけでしょうから。

ああミスりました。
魔界の仮面弁士さん25488で書かれているのが正解の気がしますね。
エラーコードが取れればもっといいのでしょうけど・・・
■No25491に返信(sodane-matigatterukamosirenaikeredoさんの記事)>
> ああミスりました。
> 魔界の仮面弁士さん25488で書かれているのが正解の気がしますね。
> エラーコードが取れればもっといいのでしょうけど・・・


もう少し粘ってみます。。。
■No25556に返信(未熟者さんの記事)
> ■No25491に返信(sodane-matigatterukamosirenaikeredoさんの記事)>
>>ああミスりました。
>>魔界の仮面弁士さん25488で書かれているのが正解の気がしますね。
>>エラーコードが取れればもっといいのでしょうけど・・・
>
>
> もう少し粘ってみます。。。
>


粘るの?

> hoge_BB B @*****.CO.JP

hoge_BB@*****.CO.JP B
にすればいいだけだと思うけど・・・?
  • 題名: Re[12]: テーブルのリンク
  • 著者: 未熟者
  • 日時: 2009/10/15 9:45:51
  • ID: 25583
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
■No25573に返信(sodane-matigatterukamosirenaikeredoさんの記事)

>>hoge_BB B @*****.CO.JP
> を
> hoge_BB@*****.CO.JP B
> にすればいいだけだと思うけど・・・?


上記の方法で出来ました!
よかったです!
sodane-matigatterukamosirenaikeredo さん有難うございます。
魔界の仮面弁士 さん有難うございます。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板