「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。 -[[戻る>データアクセスのいろいろ]] * 目次 [#w7c9c6de] #contents *概要 [#dc8f6d02] クロスDB対応のポイントをまとめた。 *詳細 [#x7479230] **SQL [#j079a683] 以下の様に差異があるため、 クロスDBの際は、 -SQLを外部ファイル化し、 -DBによって参照先のファイルを切り替える 等の方式が良い。 ***基本的な構文 [#mf762dca] -DELETE FROMのFROMがあるとエラーになるケース -JOINの構文が異なるケース --INNER JOINが使えない。 --RIGHT OUTER JOINが使えない。 ***ヒント [#wf0963d2] -ロックヒント -クエリヒント(プラン ***ストアド・関数 [#ycbb9896] -Transact-SQL、PL/SQLなどの~ ストアド・関数の定義や手続き記述の構文 -バインド変数の記号 --Oracle :「:」 --その他DB :「@」 **データプロバイダ [#o8636aaf] ***インターフェイス [#y4e7cf5c] 現ADOであるADO.NETでは、 -旧ADO -OLE -ODBC -JDBC などと同じくAPIのインターフェイスは、ある程度標準化されている。~ ***切替方式 [#v84a84dc] -ベンダ毎に別々のデータプロバイダ(バイナリ)を提供している。 -このため、切替方式は、 --内部で使用するドライバを切り替えるスタイルではなく、 --使用するデータプロバイダ(バイナリ)事態を切り替えるスタイル。 -それぞれのデータプロバイダの、名前空間.クラス型が異なるため、~ [[以下に列挙した汎用型等>#f53785e3]]を使用してプログラミングする必要がある。~ #若しくは、自前のDB部品等でラッピングする等の対策を取る必要があります。 #若しくは、自前のDB部品等でラッピングする等の対策を取る必要がある。 ***実装の差異 [#v0572201] -インターフェイス~ そもそも、インターフェイスの非互換がある。 --型指定、サイズ指定が必須~ >サイズ指定は渡すデータのサイズではなく~ DDLで定義したスキーマのサイズを指定 --名前バインドをサポートしていない >などがある。 -機能~ JDBCと比べるとADO.NETの方が、 --標準化されていないスコープや --ベンダ独自機能の実装 ---フェッチ・サイズ(DataReader) ---配列バインド >が多く、クロスDB対応には注意が必要。 ***汎用型 [#f53785e3] -System.Data.Common 名前空間~ http://msdn.microsoft.com/ja-jp/library/9tahwysy.aspx --System.Data.Common.DbConnection クラス~ http://msdn.microsoft.com/ja-jp/library/system.data.common.dbconnection.aspx --System.Data.Common.DbConnectionStringBuilder クラス~ http://msdn.microsoft.com/ja-jp/library/system.data.common.dbconnectionstringbuilder.aspx --System.Data.Common.DbTransaction クラス~ http://msdn.microsoft.com/ja-jp/library/system.data.common.dbtransaction.aspx --System.Data.Common.DbCommand クラス~ http://msdn.microsoft.com/ja-jp/library/system.data.common.dbcommand.aspx --System.Data.Common.DbParameter クラス~ http://msdn.microsoft.com/ja-jp/library/system.data.common.dbparameter.aspx --System.Data.Common.DbDataReader クラス~ http://msdn.microsoft.com/ja-jp/library/system.data.common.dbdatareader.aspx --System.Data.CommonDbDataAdapter クラス~ http://msdn.microsoft.com/ja-jp/library/system.data.common.dbdataadapter.aspx **型のマッピング [#qb049902] 特に、SELECTした結果セットの取得時、~ DBMS型と.NET(やJava)のネイティブ型とのマッピングが異なるので、~ プログラム側でキャストやコンバートのコード記述が必要になる場合がある。 主に以下の型のマッピングが問題になることがある。 ***数値型 [#v23e8924] -short -int -long -float -double -decimal ***日付 [#af8f7d0f] -DateTime -TimeSpan ***例 [#l1f52ae8] 例えば、 -ODP.NETなどでは、OracleのNumber型のサイズによって~ .NETのネイティブ型へのマッピングが変わってくる。~ -型変換の方法 --DataReaderについては、~ Get[型名](int index)という~ メソッドがあるためこれを使用できる。 --DataRowについては、~ 上記に対応するメソッドがないため自前で~ キャストやコンバートをする必要がある。 **分離レベル [#rb5f59d8] DBMSによって[[ロック・分離戦略>#qbc8c640]]が異なるので注意する。 *参考 [#fa5ee85a] **[[ADO.NETデータプロバイダ]] [#ya0d9a63] **[[DBMSのロック・分離戦略と同時実行制御]] [#qbc8c640] ---- Tags: [[:データアクセス]], [[:移行]], [[:.NET開発]], [[:ADO.NET]]