Microsoft PowerPoint - doc15409.ppt

Similar documents
Visual Basic Oracle Database 11 Release 1

Oracle Developer Days

<Documents Title Here>

Oracle Lite Tutorial

Oracle Lite Tutorial

Oracle Lite Tutorial

いまさら聞けないVB2008 ADO.NET超入門

Slide 1

MVP for VB が語る C# 入門

Microsoft Word - oo4o_extra.doc

Microsoft Word - DotNet_SmartClient_Final.doc

(OnePoint) ( URL Web Copyright 2005 Microsoft Corporation. All rights reserved. MicrosoftWindowsVisual Basic Visual Studio Microsoft Corporation

ADO.NETのアーキテクチャ

mySQLの利用

NetCOBOL for .NET 応用編

untitled

橡実践Oracle Objects for OLE

Oracle Data Provider for .NET の新機能

Oracle on Windows

Oracle9i: Microsoft .NETによる開発

VB.NET解説

intra-mart Accel Platform

データアダプタ概要

Visual Studio Oracle Database 11g アプリケーション開発入門

untitled


Windowsユーザーの為のOracle Database セキュリティ入門

第 2 章 PL/SQL の基本記述 この章では PL/SQL プログラムの基本的な記述方法について説明します 1. 宣言部 2. 実行部 3. 例外処理部

Oracle Un お問合せ : Oracle Data Integrator 11g: データ統合設定と管理 期間 ( 標準日数 ):5 コースの概要 Oracle Data Integratorは すべてのデータ統合要件 ( 大量の高パフォーマンス バッチ ローブンの統合プロセスおよ

( 目次 ) 1. はじめに 開発環境の準備 仮想ディレクトリーの作成 ASP.NET のWeb アプリケーション開発環境準備 データベースの作成 データベースの追加 テーブルの作成

DAOの利用

— intra-mart Accel Platform セットアップガイド (WebSphere編)   第7版  

Microsoft PowerPoint - 3-Forms-Others.ppt

Oracle Corporation

untitled

内容 Visual Studio サーバーエクスプローラで学ぶ SQL とデータベース操作... 1 サーバーエクスプローラ... 4 データ接続... 4 データベース操作のサブメニューコンテキスト... 5 データベースのプロパティ... 6 SQL Server... 6 Microsoft

Base によるアプリケーション開発とサポート 鎌滝雅久 /OpenOffice.org 日本ユーザー会 OSC2007 Hokkaido 2007 年 6 月 30 日土曜日 10:55-11:40 北海道大学学術交流会館第 4 会議室

NetCOBOL for .NET 応用編

Microsoft PowerPoint - 第5章補足-DB2組み込みSQL.ppt

Agenda Windows 64-bit 概要マネージコード開発 ( 導入 ) マネージコード開発 ( 詳細 ) コーディング上の留意点まとめ

C3印刷用.PDF

目次 更新履歴... 1 はじめに... 3 レコードセット?... 3 準備... 5 SQL でデータを取得する... 6 データのループ処理... 7 列の値を取得する... 7 対象行を変更する (MoveFirst, MoveNext, MovePrevious, MoveLast)...

Microsoft Word - JDBC-ODBCu691cu8a3c docx

.NETプログラマー早期育成ドリル ~VB編 付録 文法早見表~

データベースアクセス

第 1 部データベースおよびデータゕクセス テクノロジの変遷と恩恵 データゕクセスプログラミング編 1

検証報告書

Microsoft Word - dotnet_aspdotnet.doc

Oracle SQL Developer Data Modeler

今さら聞けない!? Oracle入門 ~前編~

データアダプタ概要

Seasar.NET入門

KeyWeb Creator 概要 What s KeyWeb Creator? 動的なホームページを作成するためのツール!! 従来の Web ページ DB を利用した Web ページ <HTML> <HEAD> <TITLE>show_book</TITLE> </HEAD> <BODY> <DI

PL/SQLからのオペレーティング・システム・コマンドの実行

1.SqlCtl クラスリファレンス SqlCtl クラスのリファレンスを以下に示します メソッドの実行中にエラーが発生した場合は標準エラー出力にメッセージを出力します (1)Connect() メソッド データベースへ connect 要求を行います boolean Connect(String

VB実用③ アクセス操作Ⅰ

MxLogonサーバサイドツールキット用UI

Microsoft Word - JDBC検証 docx

Microsoft認定資格問題集(70-483_demo)

Oracle Liteデータベースの理解

PowerPoint -O80_REP.PDF

以下の事項は 弊社の一般的な製品の方向性に関する概要を説明するものです また 情報提供を唯一の目的とするものであり いかなる契約にも組み込むことはできません 以下の事項は マテリアルやコード 機能を提供することをコミットメント ( 確約 ) するものではないため 購買決定を行う際の判断材料になさらな

_02_3.ppt

Oracle SQL Developerの移行機能を使用したOracle Databaseへの移行


インテル(R) Visual Fortran コンパイラ 10.0

intra-mart Accel Platform — IM-Repository拡張プログラミングガイド   初版  

「RAD Studio XE5によるマルチ言語/マルチデバイス開発の進め方」

Transcription:

.NET 環境における Oracle DB の活用 日本オラクル株式会社 本資料では.NET 環境から Oracle RDBMS にネイティブに接続するためのミドルウェアである Oracle Data Provider for.net に関して説明しています ==================== 改訂記録 ==================== 2003 年 3 月初版 2004 年 7 月第 2 版 P.43のサンプルコードの 接続クラスのインスタンス化 の部分を訂正 1

Agenda 1..NET Framework 概要.NET Frmaework とは? 共通言語ランタイム (CLR) マネージ コード vs. アンマネージ コード 2..NET と Oracle RDBMS Oracle への接続方法 ODP.NET とその他接続方法の違い ODP.NET の特徴 ODP.NET を使用するための要件 ADO.NET と比較した場合の ODP.NET 特徴的な機能詳細 3. 各データプロバイダーの比較 2 2

.NET Framework 3 3

.NET Framework VB C++ C# JScript 共通言語使用 (CLS) ASP.NET Windows Form ADO.NET 基本クラス共通言語ランタイム (CLR).NET Framework Visual Studio.NET Windows COM+ 複数言語サポートを目的とした.NET 開発プラットホーム / 実行環境 4.NET Frameworkは Microsoftが提供しているアプリケーション開発 / 実行環境です 大きな特徴は以下の3つになります プログラミング言語非依存 堅牢性のあるソフトウェア(DLLバージョンの不整合を回避 ガーベージコレクション) WebアプリケーションやWebサービスの構築 共通言語仕様 (CLS) 異なる開発言語の間で 互いのクラスを認識したり派生したりするためのルールです CLSに準拠した言語で開発されたものをマネージコード 準拠しないWin32 APIで開発されたものをアンマネージコードと呼びます VB.NETやC# で開発されたものはマネージコード COMなどはアンマネージコードになります ADO.NET ADO.NET は ADO(ActiveX Data Objects) と比べ XML と親和性が高く HTTP などを使用したデータアクセスも行えます ちなみに ADO は OLE DB の持つ機能をカプセル化し よりシンプルに操作できるようにしたもので OLE DB の各機能への窓口のようなものです 4

CLR: 共通言語ランタイム.NET アプリケーションは OS や CPU に依存しない中間コード (MSIL) 状態で管理されます 基本クラスサポート 型チェッカー スレッドサポート 例外マネージャ セキュリティエンジン 実行マネージャ デバックエンジン CLR MSIL ネイティブコンパイラ ガーベージコレクタ コードマネージャ クラスローダー.NET アプリケーションを効率よく安全に実行する実行エンジン 5 共通言語ランタイム (CLR) CLRは大きく分けて4つの層から構成されています 最も最下層がクラスローダーで メモリ上に.NETアプリケーションのクラスを展開します 下から2 層目が ガベージコレクタやコードマネージャ MSILネイティブコンパイラ (JITコンパイラ) です 3 層目に位置する型チェッカーや スレッドサポートなどは 実行時に連携し マネージコードが安全であることを保証し 開発やデバックを効率よく行うための機能を提供します 最上層の基本クラスサポートによって,.NETアプリケーションが基本クラスを介してCLRにアクセスする事を実現します 5

共通言語ランタイムでの実行 VB C# C++.NET 対応コンパイラ クラスが初めて参照されるときに クラスローダーによってクラスがメモリー上にロードされ 初めてメソッドが呼び出されたときに JIT コンパイラが MSIL をメソッド単位でコンパイル 中間コード (MSIL) JIT コンパイラ ネイティブコード ( マネージコード ) CLR: 共通言語ランタイム 中間コード (MSIL) を解釈し 実行する実行エンジン 6 現行の Microsoft の OS Windows 2000 では.NET Framework は別途インストールする必要があります 次期 OS(Windows Server 2003) では.NET Framework は OS に組み込まれる予定です 一度 JIT コンパイラによってコンパイルされたネイティブコードは メモリ上に残り再利用されます 6

言語の種類に依存しない 同一言語で開発したライブラリの使用は容易 異なる言語で開発したライブラリの流用は困難 従来 ユーザー ライブラリ ユーザー アプリケーション Visual Basic 専用ランタイム ライブラリ Windows ユーザー ライブラリ ユーザー アプリケーション Visual C++ 専用ランタイム ライブラリ 言語に関係なくライブラリを相互に利用可能.NET Framework ユーザー ライブラリ ユーザー アプリケーション ユーザー ライブラリ 共通言語ランタイム (CLR) ユーザー アプリケーション Windows 7 従来の開発環境では 異なる言語のユーザー ライブラリを流用することは難しかったのですが CLR により開発言語に関係なくユーザー ライブラリを利用できるようになります 7

使用中り当てヒープ領域 解放済みメモリー管理 従来 オブジェクトを消去してメモリー領域を解放 アプリケーション ないと 使われないメモリー領域が残るメモリみオブジェクトを消去でき 解放済ー リーク未割Windows.NET Framework.NET Framework 解放済みアプリケーション Windows 使用中解放されない領域を発見すると解放 未割り当てAP からのヒープ領域への参照状況を監視 8 従来では 使用しているオブジェクトを消去すると ヒープ領域の割り当てメモリーを解放する必要がありましたが 解放がうまく行えないと参照されない領域としてメモリー リークが発生することがありました.NET Frameworkでは アプリケーションのメモリー参照を監視し 参照されない領域を開放するためメモリー リークは発生しないようになっています これは CLR 内のガーベジ コレタによるものです 8

.NET と Oracle RDBMS 9 9

Oracle への接続 ( 非.NET) アンマネージコード COM アクセス ADO RDO DAO ODBC Bridge Jet COM Automation Services OO4O Oracle Objects for OLE OLE DB Provider ODBC Driver ODBC Driver Oracle Net Services 10 Visual Basic6.0などの開発言語からOracleへ接続する場合は ODBC OLE DB OO4Oなどのインタフェースにてアクセスすることが可能でした 特にOO4OはOracleにネイティブに接続でき かつOracle RDBMSの機能を最大限に引き出せるように拡張されているので使用頻度が高かったと思います 10

Oracle への接続 (.NET) マネージコード Oracle Data Provider for.net (ODP.NET) OLE DB.NET データプロバイダー Oracle Data Provider for OLE DB ODBC.NET データプロバイダー Oracle ODBC Driver for Oracle RCW Oracle Objects for OLE Oracle Net Services Oracle が提供 11 Visual Basic6.0 から Visual Basic.NET になり ( 他にも C# や C++ などがありますが ) ADO.NET 開発者は OLE DB.NET を介して Oracle Data Provider for OLE DB を使用する方法や Oracle Data Provider for.net を使用してデータベースアプリケーションを開発することが可能です また Visual Basic.NETで OO4Oを使用することも可能です これは.NETアプリケーションからCOMサーバーにアクセスするために MicrosoftよりRCW(Runtime Callable Wrapper) が提供されていることによります OO4Oは COMコンポーネントでありこのRCWの機能を利用することができます ソリューションエクスプローラーの参照設定より OO4O(Oracle InProc Server Type Library) を設定することで Visual Basic.NETでもOO4Oが使用できるようになります 11

RCW って何? RCW(Runtime Callable Wrapper) COM サーバー Oracle Objects for OLE アンマネージ マネージ OraSession OraDatabase OraDynaset RCW.NET クライアント OraParameter RCW は マネージコードが COM サーバーを呼び出す場合のアンマネージとマネージの相違を克服します (Microsoft から提供されています ) 12.NET から COM オブジェクト ( 今回は OO4O) が呼び出されると ランタイムは RCW を生成します RCW はマネージ オブジェクトで CLR によって保持されているヒープから割り当てられます 他のマネージ オブジェクトと同様に RCW への参照はランタイムによってトレースされ RCW はガーベジ コレクションの対象になります RCWが吸収する違い : 1. 下位のCOMオブジェクトの作成とバインディング 2.COMインタフェースの使用と インタフェースのマネージ形式への変換 3. 異なる環境間でのデータ変換のマッピング 4. ラッピングされたCOMオブジェクトの有効期間の管理 OO4O とは関係ありませんが RCW とは逆に COM クライアントが.NET のメソッドを呼び出す場合には CCW(COM Callable Wrapper) が使用されます http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpguide/html/cpconcom wrappers.asp http://www.microsoft.com/japan/msdn/net/bda/cominterop.asp 12

ODP.NET とその他の違い ODP.NET Oracle ネイティブなドライバー データ アクセスにブリッジが入らない Oracle 固有の機能のサポート OLE DB.NET,ODBC.NET オープンな規格に基づいたドライバー データ アクセスにブリッジが入る Oracle 提供以外のドライバーでは固有の機能が無い OO4O COM サーバーである RCW によるデータ変換等のオーバヘッドが発生する Oracle 固有の機能のサポート ODP.NET の方が高速で最適なアクセスを提供 13 ODP.NET は OLE DB.NET や ODBC.NET と比べると パフォーマンスや Oracle データベースの取り扱いについて優れています 13

ODP.NET とその他の違い ( パフォーマンス ) 接続方法の違いによる速度差 OO4O OLE DB.NET Data Provider ODP.NET Oracle Microsoft プログラム起動直後のログオン 1.00 0.98 1.00 1.02 2 回目のログオン 1.00 543.80 543.80 1087.60 プライマリーキー以外の参照 1.00 1.61 1.72 2.11 挿入 1.00 1.02 0.79 1.11 プライマリーキー以外の更新 1.00 1.14 0.63 1.50 数値が大きいほど OO4O に比べて速度が速い (OO4O の速度を 1 とした場合の値 ) 出展 : 翔泳社月間ドットネット マガジン 2003 年 2 月号著者初音玲 14 実際のパフォーマンスの違いについて 月間ドットネット マガジンに掲載された結果を参考値として紹介しています この記事で使用されているODP.NETは β 版です 製品版ではさらなる改良が施されておりますので あくまで目安として参照ください プログラム起動後のログオン データベース接続オブジェクトの生成から接続処理完了まで 2 回目のログオン 初回は.NET Framework の JIT コンパイラの影響があるので 2 回目以降を比較 プリマリーキー以外の参照 検索用オブジェクトの生成から解放までを 100 回ループ 検索にはプライマリーを使用するが それ以外を参照することでプライマリーキーがキャッシュされていても性能が向上しないように配慮 挿入 挿入用オブジェクトの生成から解放までを 100 回ループ プライマリーキー以外の更新 プライマリーキー以外を更新した場合を測定 更新用オブジェクトの生成から解放までを 100 回ループ 14

ODP.NET の特徴的な機能 PL/SQL の完全なサポート ネイティブな Oracle データ型のサポート LOB 型 REF カーソル DATE 型. 接続プーリング 配列バインド グローバリゼーション Unicode の完全サポート トランザクション Microsoft Transaction Server との連携 XML DB のサポート 透過的アプリケーションフェイルオーバー 15 SQL ServerデータプロバイダーやOLE DBデータプロバイダーで提供されている機能とODP.NETの機能を比較した場合 スライド中に説明されているような機能をODP.NETでは提供することが可能です これは OLE DB.NETやODBC.NETと比較した場合も ほぼ同じことが言えます 15

SQL Server と比較した場合の開発生産性 SQL Server データプロバイダ OLE DB.NET データプロバイダー OLE DB.NET App ODP for.net OLE DB.NET データプロバイダー Oracle Provider for OLE DB プログラミングインターフェースは ADO.NET - 接頭語がかわるだけ OleDbDataReader(OLE DB.NET データプロバイダー ) SqlDataReader(SQL Server データプロバイダー ) OracleDataReader(Oracle Data Provider for.net) 16 よく 統合開発ツールにVisual Studio.NETを選択した場合 最適なデータベースはSQL Serverであると思われるかたが多いのは事実です 確かに そのような面は細かな点としてあるかもしれませんが RDBMSをOracleにしたからといって開発生産性が落ちるということは無いと考えます Visual Studio.NETでは SQL Serverデータプロバイダーは標準にて実装されています ODP.NETを使用したい場合には ODP.NETをインストール後 新規プロジェクト作成時に 参照設定 より ODP.NET(Oracle.DataAccess.dll) を追加する必要があります これにより ODP.NETのクラス等が コーディング時にコーディング候補リストとして表示されるようになります ODP.NETは ADO.NET 準拠ですが SQL Serverデータプロバイダーにあって ODP.NETにないオブジェクトも存在します ( 逆も当然ある ) 細かな違いにつては それぞれのマニュアルを参照してください Oracle Data Provider for.net: http://otn.oracle.com/docs/tech/windows/odpnet/content.html SQL Serverデータプロバイダ : http://www.microsoft.com/japan/msdn/library/ja/cpref/html/frlrfsystemdatasqlclient.asp OLE DBデータプロバイダ : http://www.microsoft.com/japan/msdn/library/ja/cpref/html/frlrfsystemdataoledb.as p 16

ODP.NET アセンブリ Oracle.DataAccess.dll では 2 つの名前空間が提供される Oracle.DataAccess.Client Oracle Data Provider for.net のクラスを提供 Oracle.DataAccess.Types Oracle RDBMS 内のネイティブデータ型のクラスを提供 =================================== Visual Basic.NET Coding Sample =================================== Imports Oracle.DataAccess.Client Imports Oracle.DataAccess.Types 17 ODP.NETアセンブリでは 2つの名前空間が提供されています データ プロバイダーにあたるOracle.DataAccess.Clientと ODP.NETを使用する際にOracle データベースのネイティブデータ型を使用するためのOracle.DataAccess.Typesです 17

ODP.NET オブジェクト モデル Disconnected Layer Connected Layer (ODP.NET) Data Layer DataSet DataAdapter Command Builder DataReader Command Transaction Connection ODP.NET は ADO.NET の仕様に準拠 Oracle DB 用にビルドされているので Oracle の機能を最大限に活用可能 18 ODP.NETのオブジェクト モデルは ADO.NETの仕様に準拠しています ODP.NETは コネクション層を意味します DataSetは Microsoftが提供する非接続型のオブジェクトです ODP.NETは DataSetとOracleデータベース間の接続を提供します 18

ODP.NET オブジェクト Connection データベースに接続 Command データベースとの接続中 データを操作する SQL コマンドの実行 DataAdapter データベースと DataSet 間でデータを転送する DataSet データの読み取りと更新 DataReader Command Builder Transaction データベースからのデータストリームを格納する DataSet が更新された時に DataAdapter に対する自動 SQL 生成をおこないます ローカルのトランザクションを表すオブジェクト 19 19

DataSet オブジェクト モデル DataSet は Microsoft から提供されている System.Data 名前空間に含まれます DataSet DataTableCollection DataTable DataRowCollection DataColumnCollection ConstraintCollection DataRelationCollection DataSet は非接続型のデータ キャッシュです 変更内容は DataAdapter や DML コマンドによりデータソースに返します 20 DataSet オブジェクトは 非接続のデータキャッシュを表します DataSetへは DataAdapterのFillメソッドを使用してデータが充填されます このキャッシュは DataTables および DataRelations から構成され コマンドの結果を表します DataSet は キャッシュにおける基本的なデータの変化を追跡します この変化は DataAdapter および適用可能な Insert Update または Delete コマンドを使って元のデータソースに返すことができます 20

ODP.NET を利用したアクセス ( 接続型 ) 1OracleConnectionオブジェクトの生成 OracleConnection 2OracleConnection オブジェクトを OracleCommand の Connection プロパティに設定 VB.NET OracleCommand Connection CommandText 3SQL 文を設定 ExecuteReader 4ExecuteReader メソッドの実行 OracleDataReader 5Read メソッドが True ならレコードあり Read 21 このスライドでは ODP.NET を使用した接続型のアクセスを表しています 1OracleConnectionオブジェクトを生成し データベースへの接続を確立します 2SQL 文を実行するための OracleCommandオブジェクトに対して 1で取得した OracleConnectionオブジェクトを設定 3 実行するSQL 文をCommandTextプロパティに設定します 4ExecuteReaderメソッドにてクエリーを実行 5Readメソッドにてレコードを取得 21

DataSet を利用したアクセス ( 非接続型 ) OracleConnection 1OracleConnection オブジェクトの生成 VB.NET 2OracleConnectionオブジェクトをOracleCommandの Connectionプロパティに設定 3DataAdapterの OracleCommand プロパティに設定 Connection CommandText OracleDataAdapter SelectCommand 4Fill メソッドにて DataSet にデータを充填 Fill 自動連携 DataSet 22 このスライドでは DataSet を使用した非接続型のアクセスを表しています 1OracleConnectionオブジェクトを生成し データベースへの接続を確立します 2SQL 文を実行するための OracleCommandオブジェクトに対して 1で取得したOracleConnection オブジェクトを設定 3OracleCommandオブジェクトをOracleDataReaderのSelectCommandプロパティに設定 4DataAdapterのFillメソッドにて 内部的にSelect 文が発行されてDataSetにデータを充填 この例では OracleCommand オブジェクトを使用して SELECT 文を行っていますが OracleDataAdapter 自体にも内部的に DML 用の Command オブジェクトを持っているので その個々のオブジェクトに OracleConnection オブジェクトを割り当てて行うことも可能です 22

ODP.NET を使用するための要件 システム要件 対応オペレーティング システム Windows98, Windows NT4.0, Windows2000, Windows XP Pro(32 bit) 接続先データベース Oracle8 8.0.6 以降 クライアント環境 Oracle Client 9.2.0 Oracle Net Services 9.2.0 Microsoft.NET Framework Oracle Services for Microsoft Transaction Server 9.2.0 (Microsoft Transaction Server との統合の場合 ) 23 23

VS.NET で使用するために (1) Visual Studio.NET で ODP.NET を使用するには 参照設定に ODP.NET を追加する 1. 新規プロジェクトで Visual basic プロジェクト を作成 2. ソリューション エクスプローラーより 参照設定 を右クリックして 参照の追加 を選択 24 ODP.NETはOracle.DataAccess.dllというダイナミックリンク ライブラリにて提供されています Visual Basic.NET 等で ODP.NETを使用する場合には 参照設定にODP.NETのコンポーネントを追加する必要があります これにより コーディング時に候補リストとかも出てくるようになります 24

VS.NET で使用するために (1) 3. ODP.NET のコンポーネントを追加 4. 参照設定に Oracle.DataAccess が追加される 25 25

VS.NET で使用するために (2) ツールボックスをカストマイズして ODP.NET コントロールをツールボックスに追加 1. 右クリックにて ツールボックスのカストマイズ を選択 2..NET コンポーネント タブより Oracle のオブジェクトを選択 26 フォームなどにコントロールを貼り付ける場合があると思いますが そのままではツールボックスに ODP.NETのコントロールは表示されていません ツールボックスのカストマイズにてODP.NETのコンポーネントが表示されるように設定する必要があります 26

VS.NET で使用するために (2) ツールボックスをカストマイズして ODP.NET コントロールをツールボックスに追加 3. ツールボックスに ODP.NET のオブジェクトが表示される 27 27

接続クラス (OracleConnection) 接続文字列属性 DataSource, DBA Privilege, etc 接続プーリング Pooling, Max Pool Size, etc OS 認証 特権接続 SYSDBA, SYSOPER パスワードの期限切れ OpenWithNewPassword プロキシ認証 Proxy User Id TAF( 透過的アプリケーション フェイルオーバー ) Failover 28 OracleConnection オブジェクトでは SQL Server データプロバイダーと違い ODP.NET 固有の機能が実装されています 28

接続プーリング 接続プーリングの設定は 接続文字列として設定します =================================== Visual Basic.NET Coding Sample =================================== 接続文字列の作成 Dim sconn As Srting = User Id=scott;password=tiger;Data Source=orcl;pooling=true;max pool size=50 OracleConnection のインスタンス化 conn = New OracleConnection(sConn) データベースへの接続のオープン Conn.Open() 29 ODP.NETで接続プーリングを使用する場合は 接続文字列の中にて設定します デフォルトでは 接続プーリングは有効になっています 29

OracleCommand フェッチサイズの指定 FetchSize LONG/LONG RAW データの最適化 RowSize 配列バインドの使用 ArrayBindCount ROWID の使用 AddRowid Select for Update をサポート UpdatedRowSource OUTPUT パラメータ アウトプットパラメータは 即時利用可能 30 OracleCommand オブジェクトでも ODP.NET 固有の機能がいくつかあります 30

FetchSize 1 回のサーバーラウンドトリップでフェッチされる行数の制御ラウンドトリップの回数が少ないほどパフォーマンスが向上します =================================== Visual Basic.NET Coding Sample =================================== INSERT に必要な配列の作成 Dim cmd As OracleCommand = New OracleCommand( select * from emp, conn) Dim rdr As OracleDataReader SQL 文の作成 rdr = cmd.executereader() 行のサイズを取得 Dim sz As Long = cmd.rowsize 100 行を 1 回のフェッチで取得できるようにフェッチサイズを設定 rdr.fetchsize = sz * 100 Read メソッドの実行 While rdr.read() : : end While 31 SQL Server データプロバイダーでは Connection のプロパティに PacketSize がありネットワーク通信に使用するパケットサイズを設定できるようになっています (ODP.NET には無い ) 値の範囲は 512Byte ~ 32767Byte(Default 8192Byte) です 逆にSQL Serverデータプロバイダーは ODP.NETのようにCommandやDataReaderクラスでの FetchSizeというプロパティは存在しません ODP.NETでは OracleCommandやDataReaderのFetchSizeプロパティを使用することで サーバーラウンドトリップの回数を制御することができます FetchSiezeプロパティのデフォルトは 65536Byteです Tips FetchSizeというプロパティは OracleCommand OracleDataReaderクラスの2つに存在します あらかじめ設計時点にて レコードサイズがわかっている場合には OracleCommandのFetchSizeに指定できます レコードサイズが分からない場合は OracleCommandのRowSizeプロパティにて取得できますが ExexcuteReaderメソッドの実行後 OracleCommandには設定できません その場合は スライドの例のようにOracleDataReaderにて動的に設定します 31

配列バインド ArrayBindCount は配列バインドを使用するかどうかを指定 =================================== Visual Basic.NET Coding Sample =================================== INSERT に必要な配列の作成 Dim myarray() As Integer = New Integer() {0, 1, 2} SQL 文の作成 Dim cmd As New OracleCommand() cmd.connection = conn cmd.commandtext = insert into dept(deptno) values(:deptno) 配列のバインド cmd.arraybindcount = 3 Dim prm As OracleParameter = New OracleParameter( deptno, OracleDbType.Int32) prm.direction = ParameterDirection.Input prm.value = myarray cmd.parameters.add(prm) SQL 文の実行 cmd.executenonquery(); 32 ODP.NET では 配列バインドを使用することができます これにより 1 回のサーバーラウンドトリップで複数の行をデータベースに INSERT することが可能です 32

OracleRefCursor OracleRefCursor は REF CURSOR 型に対応する ODP.NET 型です CREATE OR REPLACE PACKAGE MyPackage AS TYPE empcur IS REF CURSOR; TYPE jobcur IS REF CURSOR; PROCEDURE GetEmpRecords( p_cursor OUTPUT empcur, j_cursor OUTPUT jobcur, indeptno IN NUMBER, p_errorcode OUTPUT NUMBER); END MyPackage / CREATE OR REPLACE PACKAGE BODY MyPackage AS PROCEDURE GetEmpRecords( p_cursor OUT empcur, j_cursor OUT jobcur, indeptno IN NUMBER, p_errorcode OUT NUMBER) IS BEGIN p_errorcode := 0; OPEN p_cursor FOR SELECT * FROM emp WHERE deptno = indeptno; OPEN j_curor FOR SELECT * FROM dept; EXCEPTION WHEN OTHERS THEN p_errorcode = SQLCODE; END GetEmpRecords; END MyPackage; / 33 Ref Cursorは Oracle PL/SQLにおけるデータ型です これは Oracleデータベースでのカーソルまたは結果セットを表します OracleRefCursorは このRef Cursorに対応するODP.NET 型になります 33

OracleRefCursor =================================== Visual Basic.NET Coding Sample =================================== PL/SQL ストアド プロシージャの実行準備 Dim rdr As OracleDataReader Dim cmd As New OracleCommand( Mypack1.GetEmpRecords, conn) cmd.commandtype = ComandType.StoredProcedure REF CURSOR パラメータのバインド cmd.parameters.add( p_cursor, OracleDbType.RefCursor, ParameterDirection.Output) cmd.parameters.add( j_cursor, OracleDbType.RefCursor, ParameterDirection.Output) cmd.parameters.add( indeptno, OracleDbType.Decimal,10, ParameterDirection.Input) cmd.parameters.add( p_errorcode, OracleDbType.Int32, ParameterDirection.Output) SQL 文の実行と Ref Cursor の使用 rdr = cmd.executereader() Dim more As Boolean = True Do While more = True Do While(rdr.Read()) Console.WriteLine( Reading. ) Loop If more = True Then Console.Writeline( Next Result ) End If Loop 34 34

セーフ型マッピング 以下の Oracle データ型は.NET 型に変換する (.NET DataSet に移入する ) 際にデータを消失する可能性があります NUMBER DATE TIMESTAMP INTERVAL DAY TO SECOND OracleDataAdapter のセーフ型マッピングを使用する事により次のいずれかの型として DataSet 内で表すことが可能になります Oracle 書式での.NET Byte[].NET の String 35 Oracle データ型は 密接に関連する.NET 型に変換される際にデータが失われる可能性があるため ODP.NET のOracleDataAdapter ではセーフ型マッピング機能が提供されています これを使用することにより データは失われず DataSet 内でデータを確実にあらわすことができます 35

セーフ型マッピング e.g)number Oracle の Number 型は最大 38 精度.NET の Decimal 型は最大 28 精度 最大値 最小値 Oracle の Number 9.9999999999999999999999 999999999999999e125-9.9999999999999999999999 999999999999999e125.NET の Decimal 79,228,162,514,264,337,593,543,950,335-79,228,162,514,264,337,593,543,950,335 =================================== Visual Basic.NET Coding Sample =================================== OracleDataAdapter のインスタンス化 Dim adapt As OracleDataAdapter = New OracleDataAdapter( select empno from emp, conn) SafeMappingの設定 empnoを.netのstring 型へマッピング adpt.safemapping.add( empno, GetType(System.String)) DataSet へのデータ充填 Dim dataset As DataSet = New DataSet() adapt.fill(dataset, emp ) 36 その他のデータ消失の可能性があるデータ型 ------------------------------------------------------------------------------------------------- OracleのDate.NETのDateTime -------- --------------------- ---------------------------------- 最大値 Dec 31, 9999 AD Dec 31, 9999 AD 25:59:59.9999999 最小値 Jan 1, 4712 BC Jan 1, 0001 AD 00:00:00.0000000 ---------------------------------------------------------------------------------------------------------- OracleのTimestamp.NETのDateTime -------- --------------------------------------- ---------------------------------- 最大値 Dec 31, 9999 AD 23:59:59.000000000 Dec 31, 9999 AD 25:59:59.9999999 最小値 Jan 1, 4712 BC 00:00:00.000000000 Jan 1, 0001 AD 00:00:00.0000000 サンプルは 以下のUS OTNを参照のこと http://otn.oracle.com/sample_code/tech/windows/odpnet/content.html 36

XML の取り扱い Oracle9i R2 では ODP.NET で XML DB はサポートされません XML の処理には PL/SQL プロシージャと CLOB 型を使用します create or replace procedure getempsasxml( theclob OUT CLOB) is ctx dbms_xmlgen.ctxhandle; begin ctx := dbms_xmlgen.newcontext('select * from emp'); theclob := dbms_xmlgen.getxml(ctx); dbms_xmlgen.closecontext(ctx); end; / dbms_xmlgen パッケージを使用したストアド プロシージャ 37 ODP.NETの最初のリリース (9.2.0.2) では XML DBはサポートされていません XMLを取り扱う場合には PL/SQLプロシージャとCLOBを使用します 37

XML の取り扱い =================================== Visual Basic.NET Coding Sample =================================== XML 文書を作成するストアド プロシージャの実行 Dim cmd As OracleCommand = New OracleCommand( getempsasxml, conn) cmd.commandtype = CommandType.StoredProcedure cmd.parameters.add( THECLOB, OracleDbType.Clob, ParameterDirection.Output) cmd.executenonquery() Dim l As OracleClob = New OracleClob(conn) l = cmd.parameters( THECLOB ).Value Console.WriteLine(l.Value) 38 38

トランザクション 接続インスタンスで BeginTransaction メソッドを実行することでトランザクションインスタンスを返す =================================== Visual Basic.NET Coding Sample =================================== conn = New OracleConnection(sConn) conn.open() Dim cmd As OracleCommand = New OracleCommand(, conn) トランザクションの開始 Dim txn As OracleTransaction = conn.begintransaction() cmd.commandtext = insert into emp(empno) values(9999) cmd.commandtype = Command.Text cmd.executenonquery() txn.commit() Commit Rollback 名前付きセーブポイントをサポート 39 Oracleデータベースでは 接続のコンテキストのみでトランザクションが開始されます ODP.NETでは OracleConnectionオブジェクトに対してトランザクションを開始する (BeginTransaction メソッド ) ことのみで これを行います OracleCommandのTransactionプロパティは 読み取り専用であり OracleCommandに使用される接続によってのみ決まり Transactionプロパティに対してトランザクション オブジェクトを割り当てる必要はありません また 分散トランザクションは System.EnterpriseServicesによってサポートされ Oracle Services for MTSが必要になります System.EnterpriseServicesについては 以下を参照してください http://www.microsoft.com/japan/msdn/library/ja/cpref/html/frlrfsystementerpriseservi ces.asp 参考 SQL Server データプロバイダでは SqlDataAdapter を使用したトランザクションの実行のために SqlCommand の Transaction プロパティを設定します ================================================== Dim cn As New SqlConnection(strConn) Dim da As New SqlDataAdapter(strSQL, cn) Dim txn As SqlTransaction = cn.begintransaction() da.updatecommand.transaction = txn da.insertcommand.transaction = txn da.deletecommand.transaction = txn ================================================== 39

グローバリゼーション グローバリゼーションの設定に従って 日付 時刻 通貨 数値 ソート順が適用されます =================================== Visual Basic.NET Coding Sample =================================== セッションにおけるグロバリゼーションを取得 Dim SessionGlob As OracleGlobalization = conn.getsessioninfo() 日付書式を設定する SessionGlob.Dateformat = YYYY/MM/DD HH24:Mi:SS conn.setsessioninfo(sessionglob) 40 グローバリゼーションの設定個所は3つあります 1つがクライアント 1つがセッション 最後がスレッドです クライアント グローバリゼーションは WindowsのレジストリのNLS_LANGから導出され OPD.NET 内では その設定値は参照のみが可能です セッション グローバリゼーションは 接続がオープンされたときに暗黙的に クライアントのグロバリゼーションの設定値が設定されます スライドのコードサンプルにように接続オブジェクトのSetSessionInfoメソッドにて再設定が可能です 40

各データプロバイダの比較 SQL コマンドやストアードプロシージャ DataSet への変更を調整する DB への接続 DB と DataSet 間のデータ転送 DB からのデータストリームを読み取り.NET Framework のサポートを目的 DB からのエラーに関する情報を収集 プロバイダのエラーを収集 DB からのエラーでスローされる例外 TAF イベントに対するデータを提供 グローバリゼーション設定 InfoMessage イベントのデータ提供 パラメータ パラメータの収集 セキュリティレベルをユーザーに割当 セキュリティアクションをカスタムセキュリティ属性に関連付け RowUpdated イベントのデータ提供 スキーマテーブルの種類を返す DB で作成するトランザクション System.Data.SqlClient SqlCommand SqlCommandBuilder SqlConnection SqlDataAdapter SqlDataReader SqlDebugging SqlError SqlErrorCollection SqlException SqlinfoMessageEventargs SqlParameter SqlParameterCollection SqlClientPermission SqlClientPermissionAttribute SqlRowUpdatedEventArgs SqlTransaction System.Data.OleDb OleDbCommand OleDbCommandBuilder OleDbConnection OleDbDataAdapter OleDbDataReader OleDbError OleDbErrorCollection OleDbException OleDbinfoMessageEventargs OleDbParameter OleDbParameterCollection OleDbClientPermission OleDbClientPermissionAttribute OleDbRowUpdatedEventArgs OleDbSchemaGuid OleDbTransaction Oracle.DataAccess OracleCommand OracleCommandBuilder OracleConnection OracleDataAdapter OracleDataReader OraclelError OracleErrorCollection OracleException OracleFailoverEventArgs OracleGlobalization OracleinfoMessageEventargs OracleParameter OracleParameterCollection OraclelRowUpdatedEventArgs OracleTransaction 41 41

関連情報 ODP.NET 関連 http://otn.oracle.com/tech/windows/odpnet/content.html http://otn.oracle.co.jp/software/tech/windows/odpnet/index.html http://windows.us.oracle.com/ Microsoft http://www.microsoft.com/japan/msdn/library/ja/cpref/html/cpref_start.asp 42 42

< サンプル コード > - Visual Basic.NET 以下のサンプル コードは ODP.NETのオブジェクトの使用方法を説明することを目的としているため エラー処理などの細かなコーディングは割愛しています オブジェクトの関連については スライド21を参照してください ---ODP.NETを修飾を行わずに使用できるようにImportsステートメントを実行 Imports System.IO Imports Oracle.DataAccess.Client Imports Oracle.DataAccess.Type ---Oracleに対する接続文字列の編集と 接続クラスのインスタンス化 Dim conn As New OracleConnection Dim sconn as String = User ID=scott;Password=tiger;Data Source=orcl conn = New OracleConnection(sConn) ---データベースとの接続を開く conn.open() ---SQL 文を実行するために OracleCommand OracleDataReaderを宣言 Dim cmd As New OracleCommand() Dim rdr As OracleDataReader ---SQL 文をCommandTextプロパティに設定し ExexcuteReaderメソッドにてSQL 文を実行 cmd.connection = conn cmd.commandtext = select ename from emp where empno = 7876 rdr = cmd.executereader --- 実行結果があれば表示し なければエラーメッセージを表示 If rdr.read Then MsgBox(rdr( ENAME )) Else MsgBox( Record Not Found!! ) End If ---OracleDatReaderオブジェクトを終了し OracleCommandオブジェクトを解放 rdr.close() cmd.dispose() 43

44