- PR -

データプロバイダについて

1
投稿者投稿内容
Y3
会議室デビュー日: 2002/10/16
投稿数: 9
投稿日時: 2002-11-07 15:56
こんにちは。ひっきーです。

データベースに接続する為のデータプロバイダについて質問があります。
Oracle用のデータプロバイダは下の2種類ありますが
・Microsoft OLE DB Provider for Oracle
・Oracle Provider for OLE DB 
どちらで接続したら良いと思いますか?

この質問をする理由は・・・
初めはOracle Provider for OLE DBを使用して接続していたのですが、
データセットへ追加や更新しようとすると読取り専用ですと言われて
エラーになってしまうのです。

しかしMicrosoft OLE DB Provider for Oracleを使用して接続したところ
データセットへ追加や更新が出来ました。

そこでMicrosoft OLE DB Provider for Oracleを使用していこうとは
思っているのですが、
Oracle Provider for OLE DB と Microsoft OLE DB Provider for Oracle
の何が違うのかはっきりしたことが分からないと不安でなりません。

もし分かる方がいらっしゃいましたら、教えてください。
よろしくお願い致します。

Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2002-11-07 18:33
引用:

ひっきーさんの書き込み (2002-11-07 15:56) より:

データベースに接続する為のデータプロバイダについて質問があります。
Oracle用のデータプロバイダは下の2種類ありますが
・Microsoft OLE DB Provider for Oracle
・Oracle Provider for OLE DB 
どちらで接続したら良いと思いますか?


 それはおかしいですね。MSのドライバは、ORACLEのドライバへの中継を行うだけです。試しにORACLEをインストールしていないマシンにMSのODBCドライバ群をインストールし、Microsoft OLE DB Provider for Oracleを使ってみてください。ORACLE社から提供されているドライバを用意してください、というメッセージが表示されます。

 ということで、Oracle Provider for OLE DBを使いましょう。
Y3
会議室デビュー日: 2002/10/16
投稿数: 9
投稿日時: 2002-11-07 19:23
Jittaさん回答ありがとうございます。

僕もOracle Provider for OLE DBを使いたいのです。
ですが以下のような現象が起きるのです。

@データプロバイダを通してOracleからデータセットに
 データを取り込む。
Aデータセットに対して追加・更新処理を行なうと
 読取り専用ですとのエラーが発生する。

自分なりの考え(
 データプロバイダはTABLEの定義をそのままデータセットに
 反映させているとのことです。
 今回データセットに取り込むデータは複数のテーブルを連結させた
 SQL文で取得しています。 
 そのためデータプロバイダはTABLEの定義(この場合VIEW)をそのまま
 データセットに反映させているために更新ができないのではと考えてます。
 )

試しに以下のパターンを試してみました。
1.SQLServerをDBにしてMicrosoft OLE DB Provider for SQLServerを使用する。
 ⇒追加・更新出来ました。
2.OracleをDBにしてMicrosoft OLE DB Provider for Oracleを使用する。
 ⇒追加・更新出来ました。
3.OracleをDBにしてOracle Provider for OLE DBを使用する。
 ⇒追加・更新出来ませんでした。。。

このことからMicrosoftのデータプロバイダでは何らかの処理をしているように
思うのですが・・・・
すいませんが、理由の分かる方・また対処方法の分かる方、どうか教えて下さい。
出来るだけOracle Provider for OLE DBを使いたいのです。
よろしくお願いします。
NothingButXMLInfoSet
大ベテラン
会議室デビュー日: 2002/07/16
投稿数: 116
投稿日時: 2002-11-07 21:31
このあたりが参考になるでしょうか?
http://www.dotnet247.com/247reference/msgs/15/75535.aspx
http://discuss.develop.com/archives/wa.exe?A2=ind0103B&L=DOTNET&D=0&I=-3&P=101353
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2002-11-08 08:26
引用:

NothingBut.NETFXさんの書き込み (2002-11-07 21:31) より:
このあたりが参考になるでしょうか?
http://www.dotnet247.com/247reference/msgs/15/75535.aspx
http://discuss.develop.com/archives/wa.exe?A2=ind0103B&L=DOTNET&D=0&I=-3&P=101353


 う〜ん、英語ができる人はすぐ英語を出す(^-^; (いや、この世界の前提知識だとは思っているんですが、やっぱりなかなか、ね (^^; )

 ざっと読んだだけですが、DataAdapterに、Insert, Update, Deleteコマンドを自分で付け足せ、というようなことが書いてありますね。ところで、私のところでは、DataServerで、Oracle Providerを使って取り出した複数のテーブルから構成したテーブルを、クライアント側で追加、削除、更新してDataServerに返す、ということをしています。当然、DataServer側では別のメソッド、別のインスタンスになるので、それらのコマンドを追加していません。クライアント側は、DataSetを受け取るので、DataAdapterは作成していません。XMLに一度落としているからOKなのかなぁ?


 ところで、接続文字列はどのようになっていますか?
 あと、IDE上でDataSetを生成した後に、テーブルの構成を変更したりしていませんか?
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2002-11-08 10:47
DataSetをデータベースに反映するには、DataAdapterのUpdate()メソッド
を使用します。

myDataAdapter.Update(myDateSet)

Update()メソッドで使用するInsert, Update, Deleteは、CommandBuilderで自動生成
することができます。

CommandBuilderで生成されたSQLを使用するときは、以下の制約があります。

・Selectで1個のテーブルのみ選択していること(複数のテーブルの連結不可)
・テーブルに主キーが存在すること
・主キーのフィールドがSelectステートメントに含まれること


Selectで複数のテーブルを結合するときは、Insert, Update, Deleteをアプリ側で用意してDataAdapterのInsertCommand, UpdateCommand, DeleteCommandプロパティに設定する必要があります。

SQL Server, Oracleなどのエンジンを使用するときは、ストアドプロシージャを作成してこれらのプロパティに設定することをお勧めします。

DataSetをデータベースに反映するとき、レコードの2重更新を回避するための処理が
必要になります。

他のユーザが同じレコードをすでに更新しているとき、DBConcurrencyExpceptionのエラーになりますので再試行などの処理を組み込む必要があります。

DataAdapterのContinueUpdateOnErrorプロパティにTrueを設定するとConcurrencyExceptionが発生しても処理を続行させることができます。この場合、DataSetのHasErrorsプロパティでエラーが発生したか調べます。

ConcurrencyExceptionが発生したときは、DataSetのMerge()メソッドを使用してOriginalのデータを最新にしてから再試行すると便利です。すでに変更したデータを再入力する必要ありません。

Happy Programming!
Akio Kasai
1

スキルアップ/キャリアアップ(JOB@IT)