「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-[[戻る>データアクセスのいろいろ]]

* 目次 [#w7c9c6de]
#contents

*SQL [#j079a683]
DBMS独自の
-ヒント
--ロックヒント
--クエリヒント(プラン
-ストアド
-関数
*概要 [#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 :「@」

などに違いがあります。~
~
このため、クロスDBの際は、SQLを外部ファイル化し、~
DBによって切り替える等の方式が良いかと思います。
**データプロバイダ [#o8636aaf]

*ADO.NET [#o8636aaf]
ADO.NETは、
***インターフェイス [#y4e7cf5c]
現ADOであるADO.NETでは、

-旧ADO
-OLE
-ODBC
-JDBC

などと同じくAPIのインターフェイスはある程度標準化されています。~
などと同じくAPIのインターフェイスは、ある程度標準化されている。~

ただし、
***切替方式 [#v84a84dc]
-ベンダ毎に別々のデータプロバイダ(バイナリ)を提供している。

-旧ADO
-OLE
-ODBC
-JDBC
-このため、切替方式は、
--内部で使用するドライバを切り替えるスタイルではなく、
--使用するデータプロバイダ(バイナリ)事態を切り替えるスタイル。

と異なり、内部で使用するドライバを切り替えるスタイルではなく、~
ベンダ毎に別々のデータプロバイダ(バイナリ)を提供しています。~
~
それぞれ名前空間.クラス型が異なるため、以下に列挙した~
汎用型等を使用してプログラミングする必要があります。~
#若しくは、自前のDB部品等でラッピングする等の対策を取る必要があります。
-それぞれのデータプロバイダの、名前空間.クラス型が異なるため、~
[[以下に列挙した汎用型等>#f53785e3]]を使用してプログラミングする必要がある。~
#若しくは、自前の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

JDBCと比べるとADO.NETの方が、
-標準化されていない部分や
-ベンダ独自機能の実装
--フェッチ・サイズ(DataReader)
--配列バインド
**型のマッピング [#qb049902]
特に、SELECTした結果セットの取得時、~
DBMS型と.NET(やJava)のネイティブ型とのマッピングが異なるので、~
プログラム側でキャストやコンバートのコード記述が必要になる場合がある。

が多く、クロスDB対応には注意が必要です。
主に以下の型のマッピングが問題になることがある。

特にHiRDBのプロバイダ(pddndp20.dll)が~
他のメジャーなDBMSのプロバイダと異なり、
-型指定、サイズ指定が必須~
#ちなみに、サイズ指定は渡すデータのサイズではなくDDLで定義したスキーマのサイズ
-名前バインドをサポートしていない
***数値型 [#v23e8924]
-short
-int
-long
-float
-double
-decimal

などがあり、クロスDB対応を困難にしています。
***日付 [#af8f7d0f]
-DateTime
-TimeSpan

-参考情報
--[[データ プロバイダ>新アーキテクチャ設計ガイド補足(アプリケーション・アーキテクチャ)#ef5e85ce]]
***例 [#l1f52ae8]
例えば、

*型のマッピング [#qb049902]
特に、SELECTした結果セットの取得時、~
DBMS型と.NET(やJava)のネイティブ型とのマッピングが異なるので、~
プログラム側でキャストやコンバートのコード記述が必要になる場合があります。~
~
主に以下の型のマッピングが問題になることがあります。
-ODP.NETなどでは、OracleのNumber型のサイズによって~
.NETのネイティブ型へのマッピングが変わってくる。~

-数値型
--short
--int
--long
--float
--double
--decimal
-型変換の方法

-日付
--DateTime
--TimeSpan

また、例えばODP.NETなどでは、~
OracleのNumber型のサイズによって~
.NETのネイティブ型へのマッピングが変わってきます。~

-型変換の方法としては、

--DataReaderについては、~
Get[型名](int index)~
というメソッドがあるためこれを使用できます。
Get[型名](int index)という~
メソッドがあるためこれを使用できる。

--DataRowについては、~
上記に対応するメソッドがないため自前で~
キャストやコンバートをする必要があります。
キャストやコンバートをする必要がある。

*分離レベル [#rb5f59d8]
DBMSによってロック・分離戦略が異なるので注意する。
**分離レベル [#rb5f59d8]
DBMSによって[[ロック・分離戦略>#qbc8c640]]が異なるので注意する。

*参考 [#fa5ee85a]
**[[ADO.NETデータプロバイダ]] [#ya0d9a63]
**[[DBMSのロック・分離戦略と同時実行制御]] [#qbc8c640]

----
Tags: [[:データアクセス]], [[:移行]], [[:.NET開発]], [[:ADO.NET]]


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS