Open棟梁Project - マイクロソフト系技術情報 Wiki -[[戻る>データアクセスのいろいろ]] * 目次 [#w7c9c6de] #contents *SQL [#j079a683] DBMS独自の -ヒント --ロックヒント --クエリヒント(プラン -ストアド -関数 などが使用されている場合は修正が必要になります。 基本的な構文でも -DELETE FROMのFROMがあるとエラーになるケース -JOINの構文が異なるケース --INNER JOINが使えない。 --RIGHT OUTER JOINが使えない。 などがあります。 また、 -Transact-SQL、PL/SQLなどの~ ストアド・プロシージャの手続き記述の構文 -バインド変数の記号 --Oracle :「:」 --その他DB :「@」 などに違いがあります。 このため、クロスDBの際は、SQLを外部ファイル化し、~ DBによって切り替える等の方式が良いかと思います。 *ADO.NET [#o8636aaf] ADO.NETは、 -旧ADO -OLE -ODBC -JDBC などと同じくAPIのインターフェイスはある程度標準化されています。~ ただし、 -旧ADO -OLE -ODBC -JDBC と異なり、内部で使用するドライバを切り替えるスタイルではなく、~ ベンダ毎に別々のデータプロバイダ(バイナリ)を提供しています。 それぞれ名前空間.クラス型が異なるため、以下に列挙した~ 汎用型等を使用してプログラミングする必要があります。~ #若しくは、自前のDB部品等でラッピングする等の対策を取る必要があります。 -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.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 JDBCと比べるとADO.NETの方が、 -標準化されていない部分や -ベンダ独自機能の実装 --フェッチ・サイズ(DataReader) --配列バインド が多く、クロスDB対応には注意が必要です。 -型指定、サイズ指定が必須~ #ちなみに、サイズ指定は渡すデータのサイズではなくDDLで定義したスキーマのサイズ -名前バインドをサポートしていない などがあります。 -参考情報 --[[ADO.NETデータプロバイダ]] *型のマッピング [#qb049902] 特に、SELECTした結果セットの取得時、~ DBMS型と.NET(やJava)のネイティブ型とのマッピングが異なるので、~ プログラム側でキャストやコンバートのコード記述が必要になる場合があります。 主に以下の型のマッピングが問題になることがあります。 -数値型 --short --int --long --float --double --decimal -日付 --DateTime --TimeSpan また、例えばODP.NETなどでは、~ OracleのNumber型のサイズによって~ .NETのネイティブ型へのマッピングが変わってきます。~ -型変換の方法としては、 --DataReaderについては、~ Get[型名](int index)~ というメソッドがあるためこれを使用できます。 --DataRowについては、~ 上記に対応するメソッドがないため自前で~ キャストやコンバートをする必要があります。 *分離レベル [#rb5f59d8] -DBMSによってロック・分離戦略が異なるので注意する。 -詳しくは、[[DBMSのロック・分離戦略と同時実行制御]]を参照。