<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>SQL Server関連</title><link>http://blogs.sqlpassj.org/masatotaniguchi/category/125.aspx</link><description>SQL Server関連</description><managingEditor>たにぐち</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>たにぐち</dc:creator><title>ASPのActiveX dllを使った連動プルダウンの実装</title><link>http://blogs.sqlpassj.org/masatotaniguchi/archive/2005/07/21/12505.aspx</link><pubDate>Thu, 21 Jul 2005 02:37:00 GMT</pubDate><guid>http://blogs.sqlpassj.org/masatotaniguchi/archive/2005/07/21/12505.aspx</guid><wfw:comment>http://blogs.sqlpassj.org/masatotaniguchi/comments/12505.aspx</wfw:comment><comments>http://blogs.sqlpassj.org/masatotaniguchi/archive/2005/07/21/12505.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.sqlpassj.org/masatotaniguchi/comments/commentRss/12505.aspx</wfw:commentRss><trackback:ping>http://blogs.sqlpassj.org/masatotaniguchi/services/trackbacks/12505.aspx</trackback:ping><description>&lt;P&gt;&lt;A href="http://blogs.sqlpassj.org/masatotaniguchi/archive/2005/07/09/12119.aspx"&gt;http://blogs.sqlpassj.org/masatotaniguchi/archive/2005/07/09/12119.aspx&lt;/A&gt;&lt;BR&gt;&lt;BR&gt;の続きになります。&lt;BR&gt;前回は、aspファイルからデータアクセスを分離してみましたが、そのデータアクセスオブジェクト(DAO)はaspから呼ばれるとは限りません。別のActiveX dllから呼ばれ、例えばWEBの画面を動的に構成するということも考えられます。その例として取り上げたのが連動（連結）プルダウン（コンボボックス）です。部署を選択すると、その部署に属する社員だけが選択されるといったVisual Basic 6.0やVBAのプログラミングではおなじみのインターフェースです。WEBアプリケーションでは連動プルダウンがいくつもある場合、部署を選択するたびにリクエストを行うと、ユーザーにもサーバーにも負担をかけてしまいます。&lt;BR&gt;そこで、例えばこのようなActiveX dllを作ってみました。&lt;BR&gt;&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;ソースファイル：linkedlist.asp&lt;BR&gt;&amp;lt;HTML&amp;gt;&lt;BR&gt;&amp;lt;HEAD&amp;gt;&lt;BR&gt;&amp;lt;TITLE&amp;gt;連動プルダウン&amp;lt;/TITLE&amp;gt;&lt;BR&gt;&amp;lt;%&lt;BR&gt;Set EmpLinkedListBox = Server.CreateObject("ScottView.clsEmpLinkedListBox")&lt;BR&gt;EmpLinkedListBox.InitFunctionName = "onInit"&lt;BR&gt;EmpLinkedListBox.ParentOnChangeFunctionName = "parentOnChange"&lt;BR&gt;EmpLinkedListBox.ParentListName = "parentList"&lt;BR&gt;EmpLinkedListBox.ChildListName = "childList"&lt;BR&gt;%&amp;gt;&lt;BR&gt;&amp;lt;%=empLinkedListBox.GetJavaScript%&amp;gt;&lt;BR&gt;&amp;lt;/HEAD&amp;gt;&lt;BR&gt;&amp;lt;BODY onLoad="onInit(document.linkedList.parentList, document.linkedList.childList)"&amp;gt;&lt;BR&gt;&amp;lt;FORM name="linkedList"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; 部署 &amp;lt;SELECT name="parentList" onChange="parentOnChange(document.linkedList.parentList, document.linkedList.childList)"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/SELECT&amp;gt;&amp;lt;BR&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; 社員 &amp;lt;SELECT name="childList"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/SELECT&amp;gt;&lt;BR&gt;&amp;lt;/FORM&amp;gt;&lt;BR&gt;&amp;lt;/BODY&amp;gt;&lt;BR&gt;&amp;lt;/HTML&amp;gt;&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;上のようなaspが変換後、下のようになれば成功です。&lt;BR&gt;&lt;BR&gt;
&lt;P&gt;
&lt;HR id=null&gt;
&lt;BR&gt;
&lt;P&gt;&amp;lt;HTML&amp;gt;&lt;BR&gt;&amp;lt;HEAD&amp;gt;&lt;BR&gt;&amp;lt;TITLE&amp;gt;連動プルダウン&amp;lt;/TITLE&amp;gt;&lt;BR&gt;&amp;lt;SCRIPT LANGUAGE="JavaScript1.1"&amp;gt;&lt;BR&gt;&amp;lt;!--&lt;BR&gt;function onInit(parentList, childList) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; childList.options[0] = new Option("CLARK", "7782")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; childList.options[1] = new Option("KING", "7839")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; childList.options[2] = new Option("MILLER", "7934")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; parentList.options[0] = new Option("ACCOUNTING", "10")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; parentList.options[1] = new Option("RESEARCH", "20")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; parentList.options[2] = new Option("SALES", "30")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; parentList.options[3] = new Option("OPERATIONS", "40")&lt;/P&gt;
&lt;P&gt;}&lt;BR&gt;function parentOnChange(parentList, childList) {&lt;BR&gt;&amp;nbsp;&amp;nbsp; var parentListValue = parentList.value;&lt;BR&gt;&amp;nbsp;&amp;nbsp; childList.length = 0;&lt;BR&gt;&amp;nbsp;&amp;nbsp; if (parentListValue == "10") {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; childList.options[0] = new Option("CLARK", "7782")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; childList.options[1] = new Option("KING", "7839")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; childList.options[2] = new Option("MILLER", "7934")&lt;BR&gt;&amp;nbsp;&amp;nbsp; } else if (parentListValue == "20") {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; childList.options[0] = new Option("SMITH", "7369")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; childList.options[1] = new Option("JONES", "7566")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; childList.options[2] = new Option("SCOTT", "7788")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; childList.options[3] = new Option("ADAMS", "7876")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; childList.options[4] = new Option("FORD", "7902")&lt;BR&gt;&amp;nbsp;&amp;nbsp; } else if (parentListValue == "30") {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; childList.options[0] = new Option("ALLEN", "7499")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; childList.options[1] = new Option("WARD", "7521")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; childList.options[2] = new Option("MARTIN", "7654")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; childList.options[3] = new Option("BLAKE", "7698")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; childList.options[4] = new Option("TURNER", "7844")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; childList.options[5] = new Option("JAMES", "7900")&lt;BR&gt;&amp;nbsp;&amp;nbsp; } else if (parentListValue == "40") {&lt;BR&gt;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;}&lt;BR&gt;// --&amp;gt;&lt;BR&gt;&amp;lt;/SCRIPT&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;lt;/HEAD&amp;gt;&lt;BR&gt;&amp;lt;BODY onLoad="onInit(document.linkedList.parentList, document.linkedList.childList)"&amp;gt;&lt;BR&gt;&amp;lt;FORM name="linkedList"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; 部署 &amp;lt;SELECT name="parentList" onChange="parentOnChange(document.linkedList.parentList, document.linkedList.childList)"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/SELECT&amp;gt;&amp;lt;BR&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; 社員 &amp;lt;SELECT name="childList"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/SELECT&amp;gt;&lt;BR&gt;&amp;lt;/FORM&amp;gt;&lt;BR&gt;&amp;lt;/BODY&amp;gt;&lt;BR&gt;&amp;lt;/HTML&amp;gt;&lt;/P&gt;
&lt;P&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;この例では、連動プルダウンは一つですが、SELECTタグの名前と、それにあわせて関数を呼ぶ時の引数を変えれば部署-社員の連動プルダウンはいくつも作ることができます（ただし初期化関数は個数分繰り返して呼ぶ必要があります）。変換後のHTMLソースをじっと眺めると、onInit関数は親子の初期化、parentOnChange関数はif分の条件式と、その{}の中に特徴があります。そこで、初期化関数(onInit)のオプション生成をコレクションにしたものと、親プルダウン変更時関数(parentOnChange)のIFブロック（部署ごとにグループ化された社員のオプション生成）をコレクションにしたものを渡せば、上記JavaScriptを生成するクラスを作成してみました。ScottViewという名前のActiveX dllプロジェクトをつくり、プロジェクトメニューの参照設定で、ScottDAOを追加します。そして以下のソースファイルを追加します。JavaScript用標準モジュール以外全てクラスモジュールですがclsEmpLinkedListBox以外はInstancingプロパティをPrivateにします。エラー処理、データのチェックは省略してあります。&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' ソースファイル clsLinkedListBoxBuilder：クラスモジュール&lt;BR&gt;&lt;/FONT&gt;Private m_ParentListName As String&lt;BR&gt;Private m_ChildListName As String&lt;BR&gt;Private m_InitFunctionName As String&lt;BR&gt;Private m_ParentOnChangeFunctionName As String&lt;BR&gt;Private m_InitFunctionOptions As Collection&lt;BR&gt;Private m_ParentOnChangeIfBlocks As Collection&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' 初期化関数名&lt;BR&gt;&lt;/FONT&gt;Public Property Let InitFunctionName(strInitFunctionName As String)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_InitFunctionName = strInitFunctionName&lt;BR&gt;End Property&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' 親リスト変更イベント関数名&lt;BR&gt;&lt;/FONT&gt;Public Property Let ParentOnChangeFunctionName( _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strParentOnChangeFunctionName As String)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_ParentOnChangeFunctionName = strParentOnChangeFunctionName&lt;BR&gt;End Property&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' 親リスト名&lt;BR&gt;&lt;/FONT&gt;Public Property Let ParentListName(strParentListName As String)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_ParentListName = strParentListName&lt;BR&gt;End Property&lt;/P&gt;
&lt;P&gt;Public Property Get ParentListName() As String&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ParentListName = m_ParentListName&lt;BR&gt;End Property&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' 子リスト名&lt;BR&gt;&lt;/FONT&gt;Public Property Let ChildListName(strChildListName As String)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_ChildListName = strChildListName&lt;BR&gt;End Property&lt;/P&gt;
&lt;P&gt;Public Property Get ChildListName() As String&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ChildListName = m_ChildListName&lt;BR&gt;End Property&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;FONT color=#008000&gt;' 初期化関数本体&lt;/FONT&gt;&lt;BR&gt;Public Property Set InitFunctionOptions(Options As Collection)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set m_InitFunctionOptions = Options&lt;BR&gt;End Property&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' ParentOnChange関数用If Block&lt;/FONT&gt;&lt;BR&gt;Public Property Set ParentOnChangeIfBlocks(IfBlocks As Collection)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set m_ParentOnChangeIfBlocks = IfBlocks&lt;BR&gt;End Property&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' 初期化関数作成&lt;BR&gt;&lt;/FONT&gt;Private Function CreateInitFunctionBody() As String&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim strRet As String&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim strOption As Variant&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; strRet = ""&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; For Each strOption In m_InitFunctionOptions&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strRet = strRet &amp;amp; JS_INDENT &amp;amp; strOption &amp;amp; vbCrLf&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CreateInitFunctionBody = strRet&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;End Function&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' ParentOnChange関数作成&lt;BR&gt;&lt;/FONT&gt;Private Function CreateParentOnChangeFunctionBody() As String&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim strRet As String&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim IfBlock As clsParentOnChangeIfBlock&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Const FIRST_IF_TEMPLATE = JS_INDENT &amp;amp; "if (parentListValue == ""?"") {"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Const ELSE_IF_TEMPLATE = JS_INDENT &amp;amp; "} else if (parentListValue == ""?"") {"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Const CLOSE_IF = JS_INDENT &amp;amp; "}"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' 選択されている親リストのキーをparentListValue変数に代入するjavaScriptコード&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; strRet = JS_INDENT &amp;amp; "var parentListValue = " &amp;amp; m_ParentListName &amp;amp; ".value;" &amp;amp; vbCrLf&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' 子リストの内容をクリア(length = 0)&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; strRet = strRet &amp;amp; JS_INDENT &amp;amp; m_ChildListName &amp;amp; ".length = 0;" &amp;amp; vbCrLf&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt; ' IFブロックの作成&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim blnFirstBlock As Boolean&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; blnFirstBlock = True&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; For Each IfBlock In m_ParentOnChangeIfBlocks&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If blnFirstBlock Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strRet = strRet &amp;amp; Replace(FIRST_IF_TEMPLATE, "?", IfBlock.Key) &amp;amp; vbCrLf&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strRet = strRet &amp;amp; IfBlock.Body&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Else&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strRet = strRet &amp;amp; Replace(ELSE_IF_TEMPLATE, "?", IfBlock.Key) &amp;amp; vbCrLf&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strRet = strRet &amp;amp; IfBlock.Body&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; blnFirstBlock = False&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt; ' IFブロックを閉じる&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; strRet = strRet &amp;amp; CLOSE_IF&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CreateParentOnChangeFunctionBody = strRet&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;End Function&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' JavaScript作成&lt;/FONT&gt;&lt;BR&gt;Public Function GetJavaScript() As String&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim strRet As String&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt; ' 初期化関数引数&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim strInitVar As String&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' ParentOnChange関数引数&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim strParentOnChangeVar As String&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; strInitVar = m_ParentListName &amp;amp; ", " &amp;amp; m_ChildListName&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; strParentOnChangeVar = m_ParentListName &amp;amp; ", " &amp;amp; m_ChildListName&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' JSタグ&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; strRet = JS_START_TAG&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' 初期化関数&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; strRet = strRet &amp;amp; CretateJSFunction(m_InitFunctionName, _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strInitVar, CreateInitFunctionBody()) &amp;amp; vbCrLf&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' ParentOnChange関数&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; strRet = strRet &amp;amp; CretateJSFunction(m_ParentOnChangeFunctionName, _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strParentOnChangeVar, CreateParentOnChangeFunctionBody()) &amp;amp; vbCrLf&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; strRet = strRet &amp;amp; JS_END_TAG&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; GetJavaScript = strRet&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;End Function&lt;BR&gt;&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;ただし、親プルダウン変更時関数(parentOnChange)のIFブロックを保存するために以下のクラスを用いました。&lt;BR&gt;&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' ソースファイル clsParentOnChangeIfBlock：クラスモジュール&lt;/FONT&gt;&lt;BR&gt;Private m_Key As String&lt;/P&gt;
&lt;P&gt;Private m_Body As String&lt;/P&gt;
&lt;P&gt;Public Property Let Key(strKey As String)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_Key = strKey&lt;BR&gt;End Property&lt;/P&gt;
&lt;P&gt;Public Property Get Key() As String&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Key = m_Key&lt;BR&gt;End Property&lt;/P&gt;
&lt;P&gt;Public Property Let Body(strBody As String)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_Body = strBody&lt;BR&gt;End Property&lt;/P&gt;
&lt;P&gt;Public Property Get Body() As String&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Body = m_Body&lt;BR&gt;End Property&lt;BR&gt;&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;またJavaScript用の共通関数として、以下の標準モジュールを使用しています。Active X dllではグローバル変数の使用はご法度なので注意が必要です。&lt;BR&gt;&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' ソースファイル JavaScript：標準モジュール&lt;BR&gt;' JavaScriptタグ&lt;BR&gt;&lt;/FONT&gt;Public Const JS_START_TAG = "
&lt;SCRIPT language="" JavaScript1.1??&gt;" &amp; vbCrLf &amp; "&lt;!--" &amp; vbCrLf&lt;BR&gt;Public Const JS_END_TAG = "// --&gt;" &amp; vbCrLf &amp; "&lt;/SCRIPT&gt;
 " &amp;amp; vbCrLf&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' インデント&lt;BR&gt;&lt;/FONT&gt;Public Const JS_INDENT = "&amp;nbsp;&amp;nbsp; "&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' JavaScript関数を作成&lt;BR&gt;&lt;/FONT&gt;Public Function CretateJSFunction(strFunctionName As String, _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strVar As String, strFunctionBody As String) As String&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CretateJSFunction = "function " &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strFunctionName &amp;amp; "(" &amp;amp; strVar &amp;amp; ") {" &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; vbCrLf &amp;amp; strFunctionBody &amp;amp; vbCrLf &amp;amp; "}"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;End Function&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' オプションを作成&lt;/FONT&gt;&lt;BR&gt;Public Function CreateJSOption( _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strSelectName As String, intOptionIndex As Integer, _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strText As String, strValue As String)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CreateJSOption = strSelectName &amp;amp; ".options" &amp;amp; "[" &amp;amp; intOptionIndex &amp;amp; "]"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CreateJSOption = CreateJSOption &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; " = new Option(""" &amp;amp; strText &amp;amp; """, """ &amp;amp; strValue &amp;amp; """)"&lt;BR&gt;End Function&lt;BR&gt;&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;clsLinkedListBoxBuilderを包み込むような感じで、clsEmpLinkedListBoxクラスを作成します。&lt;BR&gt;ScottDAOで作成したclsEmpDaoのほかに、部署用のclsDeptDaoが追加されています。&lt;BR&gt;clsDeptDaoの作り方はclsEmpDaoと全く同じです。&lt;BR&gt;&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' ソースファイル clsEmpLinkedListBox：クラスモジュール&lt;BR&gt;&lt;/FONT&gt;&lt;BR&gt;Private LinkedListBoxBuilder As clsLinkedListBoxBuilder&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#9acd32&gt;&lt;FONT color=#008000&gt;' 初期化関数名&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;Public Property Let InitFunctionName(strInitFunctionName As String)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LinkedListBoxBuilder.InitFunctionName = strInitFunctionName&lt;BR&gt;End Property&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' 親リスト変更イベント関数名&lt;/FONT&gt;&lt;BR&gt;Public Property Let ParentOnChangeFunctionName( _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strParentOnChangeFunctionName As String)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LinkedListBoxBuilder.ParentOnChangeFunctionName = _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strParentOnChangeFunctionName&lt;BR&gt;End Property&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' 親リスト名&lt;/FONT&gt;&lt;BR&gt;Public Property Let ParentListName(strParentListName As String)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LinkedListBoxBuilder.ParentListName = strParentListName&lt;BR&gt;End Property&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' 子リスト名&lt;BR&gt;&lt;/FONT&gt;Public Property Let ChildListName(strChildListName As String)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LinkedListBoxBuilder.ChildListName = strChildListName&lt;BR&gt;End Property&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' clsLinkedListBoxBuilderクラス初期化&lt;BR&gt;&lt;/FONT&gt;Private Sub Class_Initialize()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set LinkedListBoxBuilder = New clsLinkedListBoxBuilder&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;Public Function GetJavaScript() As String&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim ScottDaoFactory As clsScottDAOFactory&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim EmpDao As clsEmpDao&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim DeptDao As clsDeptDao&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim Dept As Collection&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim DeptVo As clsDeptVo&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' LinkedListBoxBuilderに渡す&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ' InitFunctionOptionsプロパティと&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ' ParentOnChangeIfBlocksプロパティ&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim InitFunctionOptions As Collection&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim ParentOnChangeIfBlocks As Collection&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set InitFunctionOptions = New Collection&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set ParentOnChangeIfBlocks = New Collection&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' 部署リストボックスの配列のINDEX用&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim intDeptCount As Integer&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&lt;FONT color=#008000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt; &lt;FONT color=#008000&gt;' 初期化関数オプション一時保存用&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim InitFunctionOption As String&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' DAOFactoryインスタンス作成&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set ScottDaoFactory = New clsScottDAOFactory&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt; ' 部署、社員DAO取得&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set DeptDao = ScottDaoFactory.DeptDao&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set EmpDao = ScottDaoFactory.EmpDao&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' 部署を全て選択&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set Dept = DeptDao.SelectDept&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt; ' 全選択された部署ごとのループ&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; intDeptCount = 0&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; For Each DeptVo In Dept&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim Emp As Collection&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim EmpVo As clsEmpVo&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' 部署（親）リスト変更イベント関数IFブロック作成&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim ParentOnChangeIfBlock As clsParentOnChangeIfBlock&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set ParentOnChangeIfBlock = New clsParentOnChangeIfBlock&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ParentOnChangeIfBlock.Key = DeptVo.DeptNo&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ParentOnChangeIfBlock.Body = ""&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; intDeptCount = intDeptCount + 1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set Emp = EmpDao.SelectEmp(DeptVo.DeptNo)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' 社員番号リストボックスの配列のINDEX用&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim intEmpCount As Integer&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; intEmpCount = 0&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' 部署に属する社員のループ&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; For Each EmpVo In Emp&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; intEmpCount = intEmpCount + 1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If intDeptCount = 1 Then&lt;BR&gt;&lt;FONT color=#008000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ' 初期化関数は、社員（子）リストボックスに&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ' 最初のINDEXの部署の社員をリストする&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; InitFunctionOption = JS_INDENT &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CreateJSOption(LinkedListBoxBuilder.ChildListName, _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; intEmpCount - 1, EmpVo.Ename, EmpVo.EmpNo)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Call InitFunctionOptions.Add(InitFunctionOption)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' ParentOnChangeのIfブロック内のオプション(INDENT二つ)&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ParentOnChangeIfBlock.Body = ParentOnChangeIfBlock.Body &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; JS_INDENT &amp;amp; JS_INDENT &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CreateJSOption(LinkedListBoxBuilder.ChildListName, _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; intEmpCount - 1, EmpVo.Ename, EmpVo.EmpNo) &amp;amp; vbCrLf&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' 初期化関数の本体を作成&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; InitFunctionOption = JS_INDENT &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CreateJSOption(LinkedListBoxBuilder.ParentListName, intDeptCount - 1, _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DeptVo.DName, DeptVo.DeptNo)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Call InitFunctionOptions.Add(InitFunctionOption)&lt;BR&gt;&lt;FONT color=#008000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ' その部署の社員分のオプションをBodyにつめ終えたので、&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ' ParentOnChangeIfBlocksコレクションに追加&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Call ParentOnChangeIfBlocks.Add(ParentOnChangeIfBlock)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ScottDaoFactory.CloseConnection&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set LinkedListBoxBuilder.InitFunctionOptions = InitFunctionOptions&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set LinkedListBoxBuilder.ParentOnChangeIfBlocks = ParentOnChangeIfBlocks&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; GetJavaScript = LinkedListBoxBuilder.GetJavaScript&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;End Function&lt;BR&gt;&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;もし、他の連動プルダウンがほしくなった時は、同じようにclsLinkedListBoxBuilderを使い新たにクラスを作成します。&lt;/P&gt;&lt;img src ="http://blogs.sqlpassj.org/masatotaniguchi/aggbug/12505.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>たにぐち</dc:creator><title>ASP(非ASP.NET)で、なるべくコードの変更を少なくして複数のデータベースに確実に対応できるようにする</title><link>http://blogs.sqlpassj.org/masatotaniguchi/archive/2005/07/09/12119.aspx</link><pubDate>Sat, 09 Jul 2005 02:43:00 GMT</pubDate><guid>http://blogs.sqlpassj.org/masatotaniguchi/archive/2005/07/09/12119.aspx</guid><wfw:comment>http://blogs.sqlpassj.org/masatotaniguchi/comments/12119.aspx</wfw:comment><comments>http://blogs.sqlpassj.org/masatotaniguchi/archive/2005/07/09/12119.aspx#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://blogs.sqlpassj.org/masatotaniguchi/comments/commentRss/12119.aspx</wfw:commentRss><trackback:ping>http://blogs.sqlpassj.org/masatotaniguchi/services/trackbacks/12119.aspx</trackback:ping><description>&lt;P&gt;&lt;A href="http://blogs.sqlpassj.org/masatotaniguchi/archive/2005/06/10/9475.aspx"&gt;http://blogs.sqlpassj.org/masatotaniguchi/archive/2005/06/10/9475.aspx&lt;/A&gt;&lt;BR&gt;のASP版(非ASP.NET)です。ActiveX dllを使用し、ASPファイルからデータアクセス部分を分離、少ない変更で複数のデータベースに対応できるようにします。&lt;/P&gt;
&lt;P&gt;Visual Basic 6.0で、ActiveX dllを作成し、ScottDAOという名前をつけます。これは、以前にご紹介したVB6版をActiveX dll化したものです。&lt;BR&gt;&lt;STRONG&gt;&lt;FONT color=#ff0000&gt;※以下のソースコードはエラー処理などが省略してあり、完全ではありません。&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;テーブル(OracleのScott.Empテーブルと、それをSQL Server 2000にインポートしたテーブル)のレコードを保存するために、VO(Value Object)を用意します。これはVB6版と全く同じでそのまま移植できます。&lt;BR&gt;&lt;STRONG&gt;Instancingプロパティは5-MultiUseとします&lt;/STRONG&gt;。&lt;BR&gt;&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' ソースコード(clsEmpVo)：クラスモジュール&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' Private 変数&lt;BR&gt;' 従業員番号&lt;BR&gt;&lt;/FONT&gt;Private m_lngEmpNo As Long&lt;BR&gt;&lt;FONT color=#008000&gt;' 従業員名&lt;/FONT&gt;&lt;BR&gt;Private m_strEname As String&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' 以下略&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' プロパティ&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Public Property Get EMPNO() As Long&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; EMPNO = m_lngEmpNo&lt;BR&gt;End Property&lt;/P&gt;
&lt;P&gt;Public Property Let EMPNO(lngEmpNo As Long)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_lngEmpNo = lngEmpNo&lt;BR&gt;End Property&lt;/P&gt;
&lt;P&gt;Public Property Get Ename() As String&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Ename = m_strEname&lt;BR&gt;End Property&lt;/P&gt;
&lt;P&gt;Public Property Let Ename(strEname As String)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_strEname = strEname&lt;BR&gt;End Property&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' 以下略（フィールド分同じものを作ります）&lt;/FONT&gt;&lt;BR&gt;&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;インターフェースクラスは外部に公開したいため、&lt;STRONG&gt;Instancingプロパティを5-MultiUse&lt;/STRONG&gt;とします。&lt;BR&gt;これをこのまま公開しても、中は空っぽです。後でちょっと細工をします。&lt;BR&gt;&lt;BR&gt;
&lt;HR id=null&gt;
&lt;BR&gt;&lt;BR&gt;&lt;FONT color=#008000&gt;' ソースコード(clsEmpDao) ：クラスモジュール&lt;/FONT&gt; 
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;Public Function SelectEmp(lngDeptNo As Long) As Collection&lt;/P&gt;
&lt;P&gt;End Function&lt;/P&gt;
&lt;P&gt;Public Function InsertEmp(EmpVo As clsEmpVo) As Boolean&lt;/P&gt;
&lt;P&gt;End Function&lt;/P&gt;
&lt;P&gt;Public Function UpdateEmp(EmpVo As clsEmpVo) As Boolean&lt;/P&gt;
&lt;P&gt;End Function&lt;BR&gt;&lt;BR&gt;Public Property Set Connection(con As Object)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;End Property&lt;BR&gt;&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;clsEmpSQLServerDaoはVB6版とほとんど同じです（選択条件が部署番号になっている部分だけが違います）。このクラスは外部に公開しないため、&lt;STRONG&gt;Instancingプロパティを1-Private&lt;/STRONG&gt;とします。&lt;BR&gt;Oracleについても全く同じなので、ここでは省略します。VB6版をご参照ください。&lt;BR&gt;なお、nvl関数は標準モジュールにある独自の関数で動作はORACLEのNVLと全く同じです。&lt;BR&gt;&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' ソースコード(clsEmpSQLServerDao)：クラスモジュール&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Implements clsEmpDao&lt;BR&gt;&lt;BR&gt;Private Connection As Object&lt;/P&gt;
&lt;P&gt;Public Property Set clsEmpDao_Connection(con As Object)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set Connection = con&lt;BR&gt;End Property&lt;BR&gt;&lt;BR&gt;Public Function clsEmpDao_SelectEmp(lngDeptNo As Long) As Collection&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim cmd As New ADODB.Command&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim result As New Collection&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim rs As ADODB.Recordset&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt; ' Commandの設定&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; With cmd&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .ActiveConnection =&amp;nbsp;Connection&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .CommandText = "SELECT * FROM EMP WHERE DEPTNO = ?"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .CreateParameter , adInteger, adParamInput&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Parameters(0).Value = lngDeptNo&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End With&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' SQLを実行して結果セットを取得します&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set rs = cmd.Execute&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt; ' Recordsetから、VOへ値を詰めます&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Do Until rs.EOF&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim EmpVo As clsEmpVo&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set EmpVo = New clsEmpVo&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EmpVo.EmpNo = nvl(rs.Fields("EMPNO"), 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EmpVo.Ename = nvl(rs.Fields("ENAME"), "")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EmpVo.Job = nvl(rs.Fields("JOB"), "")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EmpVo.Mgr = nvl(rs.Fields("MGR"), 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EmpVo.HireDate = nvl(rs.Fields("HireDate"), 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EmpVo.Sal = nvl(rs.Fields("SAL"), 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EmpVo.Comm = nvl(rs.Fields("COMM"), 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EmpVo.DeptNo = nvl(rs.Fields("DEPTNO"), 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Call result.Add(EmpVo)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rs.MoveNext&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Loop&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' 後始末&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; rs.Close&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set rs = Nothing&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' 戻り値(VOのコレクション)の設定&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set clsEmpDao_SelectEmp = result&lt;BR&gt;End Function&lt;/P&gt;
&lt;P&gt;Public Function clsEmpDao_InsertEmp(EmpVo As clsEmpVo) As Boolean&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' 省略&lt;BR&gt;&lt;/FONT&gt;End Function&lt;/P&gt;
&lt;P&gt;Public Function clsEmpDao_UpdateEmp(EmpVo As clsEmpVo) As Boolean&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' 省略&lt;BR&gt;&lt;/FONT&gt;End Function&lt;BR&gt;&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;さて、公開したいのはEmpDaoですがASPに渡したいのは中身の詰まったクラスです。&lt;BR&gt;そこで以下のようなクラスを作成し外部に公開します（&lt;STRONG&gt;Instancingプロパティを5-MultiUse&lt;/STRONG&gt;）。&lt;BR&gt;データベースを変更する必要が出た時はここを変更します。&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' ソースコード(clsScottDaoFactory)：クラスモジュール&lt;BR&gt;&lt;BR&gt;' このクラスが生成するDAOは、clsScottDaoFactory&lt;BR&gt;' のインスタンスが存命中の場合のみ使用できます。&lt;BR&gt;' clsScottDaoFactoryインスタンスの消滅とともにDB&lt;BR&gt;' &lt;/FONT&gt;&lt;FONT color=#008000&gt;接続も自動的にCloseされるためです。&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Private&amp;nbsp;Connection As clsConnection&lt;BR&gt;&lt;BR&gt;Public Function EmpDAO() As clsEmpDao&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim emp As clsEmpDao&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt;' DB変更時、コードの変更が必要な場所&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Set emp = New clsEmpSQLServerDao&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt;' Set emp = New clsEmpOracleDao&lt;/FONT&gt;&lt;FONT color=#008000&gt;&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp; Set Emp.Connection = Connection.GetConnection&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp; Set EmpDAO = emp&lt;BR&gt;End Function&lt;/P&gt;
&lt;P&gt;Private Sub Class_Initialize()&lt;BR&gt;&amp;nbsp;&amp;nbsp; Dim ConnectionFactory As New clsConnectionFactory&lt;BR&gt;&amp;nbsp;&amp;nbsp; Set Connection = ConnectionFactory.GetClsConnection&lt;BR&gt;End Sub&lt;BR&gt;&lt;BR&gt;&lt;FONT color=#008000&gt;' このメソッドは使用後、なるべく早く実行するようにします。&lt;/FONT&gt;&lt;BR&gt;Public Sub CloseConnection()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Connection.CloseConnection&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set Connection = Nothing&lt;BR&gt;End Sub&lt;BR&gt;&lt;BR&gt;&lt;FONT color=#008000&gt;' 安全策&lt;BR&gt;&lt;/FONT&gt;Private Sub Class_Terminate()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; If Not Connection Is Nothing Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Connection.CloseConnection&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;BR&gt;End Sub&lt;BR&gt;&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;ＤＢの接続のためのクラス、clsConnectionを定義します。これはインターフェースとして扱います（&lt;STRONG&gt;Instancingプロパティを5-MultiUse&lt;/STRONG&gt;）。&lt;BR&gt;&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' &lt;/FONT&gt;&lt;FONT color=#008000&gt;ソースコード(clsConnection)：クラスモジュール&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Public Function GetConnection() As Object&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;End Function&lt;/P&gt;
&lt;P&gt;Public Sub CloseConnection()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;End Sub&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;SQLServerのためのclsConnectionの実装クラスを定義します（&lt;STRONG&gt;Instancingプロパティを1-Private&lt;/STRONG&gt;）。Oracle用のclsOracleConnectionは省略します。&lt;BR&gt;&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' ソースコード(clsSQLServerConnection)：クラスモジュール&lt;BR&gt;&lt;/FONT&gt;&lt;BR&gt;Implements clsConnection&lt;/P&gt;
&lt;P&gt;Private adoSQLServerCon As ADODB.Connection&lt;/P&gt;
&lt;P&gt;Public Function clsConnection_GetConnection() As Object&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set clsConnection_GetConnection = adoSQLServerCon&lt;BR&gt;End Function&lt;BR&gt;&lt;BR&gt;Public Sub clsConnection_CloseConnection()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; adoSQLServerCon.Close&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set adoSQLServerCon = Nothing&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;Private Sub Class_Initialize()&lt;BR&gt;&amp;nbsp;&amp;nbsp; Set adoSQLServerCon = New ADODB.Connection&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; adoSQLServerCon.ConnectionString = _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "PROVIDER=SQLOLEDB;SERVER=ServerName;DATABASE=Scott;UID=sa;PWD=*******"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; adoSQLServerCon.Open&lt;BR&gt;End Sub&lt;/P&gt;
&lt;HR id=null&gt;
clsConnectionクラスを作成するためのクラスを定義します（&lt;STRONG&gt;Instancingプロパティを5-MultiUse&lt;/STRONG&gt;）。 
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' ソースコード(clsConnectionFactory)：クラスモジュール&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;Public Function GetClsConnection() As clsConnection&lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' DB変更時、コードの変更が必要な場所&lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;Set GetClsConnection = New clsSQLServerConnection&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt;' Set GetClsConnection = New clsOracleConnection&lt;BR&gt;&lt;/FONT&gt;End Function&lt;/P&gt;
&lt;P&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;以上のActiveX dllを作成しレジストリに登録します。これをテストするためのＡＳＰファイルを用意しました。&lt;BR&gt;For Eachが不安な方は、レコード数をresult.countで取得できるのでFor...Next文で書き換えてもいいと思います。&lt;BR&gt;&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' ソースコード(ScottEmp.asp)：aspファイル&lt;/FONT&gt;&lt;BR&gt;&lt;BR&gt;&amp;lt;HTML&amp;gt;&lt;BR&gt;&amp;lt;BODY&amp;gt;&lt;BR&gt;&amp;lt;%&lt;BR&gt;Set scottDAOFactory = Server.CreateObject("ScottDAO.clsScottDAOFactory")&lt;BR&gt;Set empDAO = scottDAOFactory.EmpDAO&lt;BR&gt;Set result = empDAO.SelectEmp(20)&lt;BR&gt;scottDAOFactory.CloseConnection&lt;BR&gt;%&amp;gt;&lt;BR&gt;&amp;lt;TABLE border="1"&amp;gt;&lt;BR&gt;&amp;lt;TR&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;TH&amp;gt;従業員番号&amp;lt;/TH&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;TH&amp;gt;名前&amp;lt;/TH&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;TH&amp;gt;職種&amp;lt;/TH&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;TH&amp;gt;上司&amp;lt;/TH&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;TH&amp;gt;入社日&amp;lt;/TH&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;TH&amp;gt;給料&amp;lt;/TH&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;TH&amp;gt;歩合&amp;lt;/TH&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;TH&amp;gt;部署番号&amp;lt;/TH&amp;gt;&lt;BR&gt;&amp;lt;/TR&amp;gt;&lt;BR&gt;&amp;lt;%&lt;BR&gt;For Each empVo In result&lt;BR&gt;%&amp;gt;&lt;BR&gt;&amp;lt;TR&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;TD&amp;gt;&amp;lt;%=empVo.EmpNo%&amp;gt;&amp;lt;/TD&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;TD&amp;gt;&amp;lt;%=empVo.Ename%&amp;gt;&amp;lt;/TD&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;TD&amp;gt;&amp;lt;%=empVo.Job%&amp;gt;&amp;lt;/TD&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;TD&amp;gt;&amp;lt;%=EmpVo.Mgr%&amp;gt;&amp;lt;/TD&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;TD&amp;gt;&amp;lt;%=EmpVo.Hiredate%&amp;gt;&amp;lt;/TD&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;TD&amp;gt;&amp;lt;%=empVo.Sal%&amp;gt;&amp;lt;/TD&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;TD&amp;gt;&amp;lt;%=EmpVo.Comm%&amp;gt;&amp;lt;/TD&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;TD&amp;gt;&amp;lt;%=empVo.deptNo%&amp;gt;&amp;lt;/TD&amp;gt;&lt;BR&gt;&amp;lt;/TR&amp;gt;&lt;BR&gt;&amp;lt;%&lt;BR&gt;Next&lt;BR&gt;%&amp;gt;&lt;BR&gt;&amp;lt;/TABLE&amp;gt;&lt;BR&gt;&amp;lt;/BODY&amp;gt;&lt;BR&gt;&amp;lt;/HTML&amp;gt;&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;基本方針は、&lt;BR&gt;&lt;BR&gt;aspファイルには画面表示ロジック以外はなるべく書かないようにする&lt;BR&gt;&lt;BR&gt;ということです。ビジネスロジックもActiveX dllでカプセル化し、aspファイルからはそれを呼ぶだけにするようにします。&lt;/P&gt;&lt;img src ="http://blogs.sqlpassj.org/masatotaniguchi/aggbug/12119.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>たにぐち</dc:creator><title>SQL Server 2000 JDBCのDBCPを使用したコネクションプーリング</title><link>http://blogs.sqlpassj.org/masatotaniguchi/archive/2005/07/02/10799.aspx</link><pubDate>Sat, 02 Jul 2005 15:29:00 GMT</pubDate><guid>http://blogs.sqlpassj.org/masatotaniguchi/archive/2005/07/02/10799.aspx</guid><wfw:comment>http://blogs.sqlpassj.org/masatotaniguchi/comments/10799.aspx</wfw:comment><comments>http://blogs.sqlpassj.org/masatotaniguchi/archive/2005/07/02/10799.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.sqlpassj.org/masatotaniguchi/comments/commentRss/10799.aspx</wfw:commentRss><trackback:ping>http://blogs.sqlpassj.org/masatotaniguchi/services/trackbacks/10799.aspx</trackback:ping><description>&lt;P&gt;SQL Server 2000 Driver for JDBCのConnection Poolingについては、&lt;BR&gt;&lt;A href="http://support.microsoft.com/default.aspx?scid=kb;ja;313173"&gt;http://support.microsoft.com/default.aspx?scid=kb;ja;313173&lt;/A&gt;&lt;BR&gt;に実装方法のサンプルがありますが、これはあくまでサンプルであり、完全ではないようです。腕に自信のある方はいざ実装というところなのでしょうが、そんな自信も時間の余裕もない方はやはりJakarta CommonsのDBCPの利用でしょうか。これを使うととても簡単にコネクションプーリングを使用することができます。そこで、&lt;BR&gt;&lt;A href="http://www.jajakarta.org/commons/dbcp-1.0/ja/withoutPrimary/overview-summary.html"&gt;http://www.jajakarta.org/commons/dbcp-1.0/ja/withoutPrimary/overview-summary.html&lt;/A&gt;を参考にして、色々試してみることにしました。&lt;/P&gt;
&lt;P&gt;ダウンロードは以下のサイトからできます。&lt;BR&gt;&lt;A href="http://jakarta.apache.org/site/downloads/downloads_commons-dbcp.cgi"&gt;http://jakarta.apache.org/site/downloads/downloads_commons-dbcp.cgi&lt;/A&gt;&lt;BR&gt;&lt;A href="http://archive.apache.org/dist/xml/xerces-j/"&gt;http://archive.apache.org/dist/xml/xerces-j/&lt;/A&gt;&lt;BR&gt;&lt;BR&gt;これらのパッケージ中に含まれるjarファイル&lt;BR&gt;commons-dbcp-1.2.1.jar&lt;BR&gt;resolver.jar&lt;BR&gt;xercesImpl.jar&lt;BR&gt;xercesSamples.jar&lt;BR&gt;xml-apis.jar&lt;BR&gt;xmlParserAPIs.jar&lt;/P&gt;
&lt;P&gt;をCLASSPATHに通し、&lt;/P&gt;
&lt;P&gt;joclファイルをCLASSPATHの通ったところにおいておけばOK。これでserver.xmlなどの書きかえは不要になります。&lt;BR&gt;joclファイルはPoolableConnectionFactoryについて作成します。&lt;BR&gt;同梱されているjavadocを見るとPoolableConnectionFactoryのコンストラクタは、２つ用意されています。&lt;BR&gt;（４つはdeprecateされたクラスAbandonedConfigを使用しているため、deprecateされています）。&lt;BR&gt;主な引数は、&lt;BR&gt;1.org.apache.commons.dbcp.ConnectionFactory connFactory(これはInterface)&lt;BR&gt;2.org.apache.commons.pool.ObjectPool pool(これもInterface)&lt;BR&gt;3.org.apache.commons.pool.KeyedObjectPoolFactory(これもInterface) stmtPoolFactory&lt;BR&gt;4.String validationQuery(検証用SQL)&lt;BR&gt;5.boolean defaultReadOnly(読取専用)&lt;BR&gt;6.boolean defaultAutoCommit(オートコミットデフォルト設定)&lt;BR&gt;7.int defaultTransactionIsolation(デフォルトのTransaction分離レベル)&lt;/P&gt;
&lt;P&gt;ここでは、&lt;BR&gt;PoolableConnectionFactory(org.apache.commons.dbcp.ConnectionFactory connFactory, ObjectPool pool, KeyedObjectPoolFactory stmtPoolFactory, String validationQuery, Boolean defaultReadOnly, boolean defaultAutoCommit, int defaultTransactionIsolation) &lt;BR&gt;を使用することにします。Transaction分離レベルについてはローラー作戦で一通り試してみました。&lt;BR&gt;（ConnectionクラスのsetTransactionIsolationを使用しプロファイラを観察）。&lt;BR&gt;
&lt;TABLE border=1&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD bgColor=#cccccc&gt;setTransactionIsolationに与えた引数&lt;/TD&gt;
&lt;TD bgColor=#cccccc&gt;プロファイラの結果&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;TRANSACTION_READ_UNCOMMITTED&lt;/TD&gt;
&lt;TD&gt;SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;TRANSACTION_READ_COMMITTED&lt;/TD&gt;
&lt;TD&gt;SET TRANSACTION ISOLATION LEVEL READ COMMITTED&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;TRANSACTION_REPEATABLE_READ&lt;/TD&gt;
&lt;TD&gt;SET TRANSACTION ISOLATION LEVEL REPEATABLE READ&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;TRANSACTION_SERIALIZABLE&lt;/TD&gt;
&lt;TD&gt;SET TRANSACTION ISOLATION LEVEL SERIALIZABLE&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;TRANSACTION_NONE&lt;/TD&gt;
&lt;TD&gt;SET TRANSACTION ISOLATION LEVEL(['LEVEL' の近くに無効な構文があります]の例外発生。)&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;そういうわけで、安心してdefaultTransactionIsolationには、上記のNONE以外のどれかが使えます。&lt;/P&gt;
&lt;P&gt;早速joclファイル(PoolableConnectionFactory)を作成します。&lt;BR&gt;&amp;lt;object class="org.apache.commons.dbcp.PoolableConnectionFactory"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns="http://apache.org/xml/xmlns/jakarta/commons/jocl"&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;lt;/object&amp;gt;&lt;BR&gt;このタグの中に、コンストラクタの引数を埋め込んでいきます。&lt;/P&gt;
&lt;P&gt;まず、1.のorg.apache.commons.dbcp.ConnectionFactory connFactoryから。&lt;BR&gt;これはInterfaceなので、それを実装したDriverManagerConnectionFactoryを使用します。&lt;BR&gt;コンストラクタは&lt;BR&gt;DriverManagerConnectionFactory(String connectUri, String uname, String passwd)&lt;BR&gt;を使用します。よって、この引数に相当するタグは以下のようになります。&lt;BR&gt;&amp;lt;object class="org.apache.commons.dbcp.DriverManagerConnectionFactory"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;!-- URL:接続文字列 --&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;string value="jdbc:microsoft:sqlserver://サーバー名:1433;databaseName=Northwind;selectMethod=cursor"/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;!-- ユーザー名 --&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;string value="sa"/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;!-- パスワード --&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;string value="*******"/&amp;gt;&lt;BR&gt;&amp;lt;/object&amp;gt;&lt;/P&gt;
&lt;P&gt;2.のorg.apache.commons.pool.ObjectPoolは、Interfaceneなのでそれを実装した&lt;BR&gt;org.apache.commons.pool.impl.GenericObjectPoolを使用します。コンストラクタが11個もあります。&lt;BR&gt;ここでは、&lt;BR&gt;GenericObjectPool(PoolableObjectFactory factory, int maxActive, byte whenExhaustedAction, long maxWait, int maxIdle, int minIdle, boolean testOnBorrow, boolean testOnReturn, long timeBetweenEvictionRunsMillis, int numTestsPerEvictionRun, long minEvictableIdleTimeMillis, boolean testWhileIdle) &lt;BR&gt;を使用することにします。&lt;BR&gt;このコンストラクタ最初の引数、PoolableObjectFactoryもInterfaceですが、&lt;BR&gt;&amp;lt;object class="org.apache.commons.pool.PoolableObjectFactory" null="true"/&amp;gt;&lt;BR&gt;とできます。実際のConnection(poolされるobject)はPoolableConnectionFactoryが生成するそうなので、これでOK。&lt;BR&gt;これは、&lt;BR&gt;GenericObjectPool connectionPool = new GenericObjectPool(null, ......);&lt;BR&gt;に相当します。&lt;BR&gt;後の引数はプリミティブ型です。コンストラクタの引数並び順に並べると以下のようになります。&lt;BR&gt;&amp;lt;!-- ObjectPool --&amp;gt;&lt;BR&gt;&amp;lt;object class="org.apache.commons.pool.impl.GenericObjectPool"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;!-- PoolableObjectFactory --&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;object class="org.apache.commons.pool.PoolableObjectFactory" null="true"/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;!-- 最大アクティブ接続数(maxActive) --&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;int value="50"/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;!-- オブジェクトが尽きたときの処理（0:失敗,1:待つ,2:接続を増やす)(whenExhaustedAction)--&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;byte value="1"/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;!-- whenExhaustedActionで1:待つを指定した場合の最大待機時間(maxWait) --&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;long value="15000"/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;!-- アイドル状態のコネクションの最大数(maxIdle) --&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;int value="50"/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;!-- アイドル状態のコネクションの最小数(minIdle) --&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;int value="10"/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;!-- コネクション取得時のテストの実行(testOnBorrow) --&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;boolean value="true"/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;!-- コネクション返却のテストの実行(testOnReturn) --&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;boolean value="false"/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;!-- プール内オブジェクト排除スレッドの実行間隔(timeBetweenEvictionRunsMillis) --&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;long value="10000"/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;!-- プール内オブジェクト排除スレッドが一度に処理するコネクションの数(numTestsPerEvictionRun) --&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;int value="20"/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;!-- 排除対象となるまでの最短アイドル時間(minEvictableIdleTimeMillis) --&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;long value="380000"/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;!-- アイドル状態のコネクションのテストの実行(testWhileIdle) --&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;boolean value="false"/&amp;gt; &lt;BR&gt;&amp;lt;/object&amp;gt;&lt;/P&gt;
&lt;P&gt;3.のKeyedObjectPoolFactoryもInterfaceなので、これを実装したStackKeyedObjectPoolFactoryを使用します。&lt;BR&gt;&amp;lt;object class="org.apache.commons.pool.StackKeyedObjectPoolFactory"/&amp;gt;&lt;/P&gt;
&lt;P&gt;4.の検証用SQLですがなるべく軽いものがいいです。oracleの場合、&lt;BR&gt;SELECT COUNT(*) FROM DUALが使われているようですが、&lt;BR&gt;SQL Serverの場合は&lt;BR&gt;SELECT null&lt;BR&gt;で良いと思います。&lt;BR&gt;&amp;lt;!-- 検証用クエリ --&amp;gt;&lt;BR&gt;&amp;lt;string value="SELECT null"/&amp;gt;&lt;/P&gt;
&lt;P&gt;5.の読取専用はもちろんfalseで&lt;BR&gt;&amp;lt;!-- 読取専用 --&amp;gt;&lt;BR&gt;&amp;lt;boolean value="false"/&amp;gt;&lt;/P&gt;
&lt;P&gt;6.のAuto Commitは、trueで&lt;BR&gt;&amp;lt;!-- Auto Commit --&amp;gt;&lt;BR&gt;&amp;lt;boolean value="true"/&amp;gt;&lt;/P&gt;
&lt;P&gt;7.最後のTransaction分離レベルですが、&lt;BR&gt;java.sql.Connection &lt;BR&gt;public static final int TRANSACTION_NONE 0 &lt;BR&gt;public static final int TRANSACTION_READ_COMMITTED 2 &lt;BR&gt;public static final int TRANSACTION_READ_UNCOMMITTED 1 &lt;BR&gt;public static final int TRANSACTION_REPEATABLE_READ 4 &lt;BR&gt;public static final int TRANSACTION_SERIALIZABLE 8 &lt;BR&gt;となっていますので、TRANSACTION_READ_COMMITTEDを明示的に指定するには&lt;BR&gt;&amp;lt;!-- トランザクション分離レベル --&amp;gt;&lt;BR&gt;&amp;lt;int value="2"/&amp;gt;&lt;BR&gt;とします(デフォルトは、TRANSACTION_READ_COMMITTEDなので本来は不要)。&lt;/P&gt;
&lt;P&gt;以下、joclファイルの最終形です。これにsqlserver.jocl（拡張子以外任意）という名前をつけて、CLASSPATHの通ったところに配置します。&lt;BR&gt;&lt;BR&gt;
&lt;HR id=null&gt;
&lt;/P&gt;
&lt;P&gt;&amp;lt;object class="org.apache.commons.dbcp.PoolableConnectionFactory"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns="http://apache.org/xml/xmlns/jakarta/commons/jocl"&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;lt;!-- DriverManagerConnectionFactory --&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;object class="org.apache.commons.dbcp.DriverManagerConnectionFactory"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- URL:接続文字列 --&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;string value="jdbc:microsoft:sqlserver://サーバー名:1433;databaseName=Northwind;selectMethod=cursor"/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- ユーザー名 --&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;string value="sa"/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- パスワード --&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;string value="**********"/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/object&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;lt;!-- ObjectPool --&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;object class="org.apache.commons.pool.impl.GenericObjectPool"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- PoolableObjectFactory --&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;object class="org.apache.commons.pool.PoolableObjectFactory" null="true"/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- 最大アクティブ接続数(maxActive) --&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;int value="50"/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- オブジェクトが尽きたときの処理（0:失敗,1:待つ,2:接続を増やす)(whenExhaustedAction)--&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;byte value="1"/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- whenExhaustedActionで1:待つを指定した場合の最大待機時間(maxWait) --&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;long value="15000"/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- アイドル状態のコネクションの最大数：最大アイドル数(maxIdle) --&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;int value="50"/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- アイドル状態のコネクションの最小数：最小アイドル数(minIdle) --&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;int value="15"/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- コネクション取得時のテストの実行(testOnBorrow) --&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;boolean value="true"/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- コネクション返却のテストの実行(testOnReturn) --&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;boolean value="false"/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- 排除スレッドの実行間隔(timeBetweenEvictionRunsMillis) --&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;long value="10000"/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- 排除スレッドが一度に処理するコネクションの数(numTestsPerEvictionRun) --&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;int value="20"/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- 排除対象となるまでの最短アイドル時間(minEvictableIdleTimeMillis) --&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;long value="380000"/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- アイドル状態のコネクションのテストの実行(testWhileIdle) --&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;boolean value="false"/&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/object&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;!-- KeyedObjectPoolFactory --&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;object class="org.apache.commons.pool.StackKeyedObjectPoolFactory"/&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;lt;!-- 検証用クエリ --&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;string value="SELECT null"/&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;lt;!-- 読取専用（デフォルト） --&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;boolean value="false"/&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;lt;!-- Auto Commit（デフォルト） --&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;boolean value="true"/&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;lt;!-- デフォルトのトランザクション分離レベル --&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;!--&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static final int TRANSACTION_NONE 0 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static final int TRANSACTION_READ_COMMITTED 2 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static final int TRANSACTION_READ_UNCOMMITTED 1 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static final int TRANSACTION_REPEATABLE_READ 4 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static final int TRANSACTION_SERIALIZABLE 8 &lt;BR&gt;&amp;nbsp;&amp;nbsp; --&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;int value="2"/&amp;gt;&lt;BR&gt;&amp;lt;/object&amp;gt;&lt;BR&gt;&lt;BR&gt;
&lt;HR id=null&gt;
&lt;/P&gt;
&lt;P&gt;これを使用して色々実験してみます。&lt;BR&gt;以下のように実験に使うServletを用意しました。&lt;BR&gt;&lt;BR&gt;
&lt;HR id=null&gt;
&lt;/P&gt;
&lt;P&gt;package org.passj.blogs.taniguchi.test_servlet;&lt;/P&gt;
&lt;P&gt;import java.io.IOException;&lt;BR&gt;import java.io.PrintWriter;&lt;BR&gt;import java.sql.Connection;&lt;BR&gt;import java.sql.DriverManager;&lt;/P&gt;
&lt;P&gt;import javax.servlet.ServletException;&lt;BR&gt;import javax.servlet.http.HttpServlet;&lt;BR&gt;import javax.servlet.http.HttpServletRequest;&lt;BR&gt;import javax.servlet.http.HttpServletResponse;&lt;/P&gt;
&lt;P&gt;/**&lt;BR&gt;&amp;nbsp;* @author たにぐち&lt;BR&gt;&amp;nbsp;*&lt;BR&gt;&amp;nbsp;*/&lt;BR&gt;public class TestServlet extends HttpServlet {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void doGet(HttpServletRequest req, HttpServletResponse res) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throws ServletException, IOException {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; res.setContentType("text/html;charset=Shift_JIS");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PrintWriter out = res.getWriter();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Connection con = null;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; out.println("&amp;lt;html&amp;gt;\n");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; out.println("&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;コネクションプーリングのテスト&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;\n");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; out.println("&amp;lt;body&amp;gt;");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; out.println("&amp;lt;P&amp;gt;コネクションプーリングをテストします。");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // デフォルトのSAXドライバの指定&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (System.getProperty("org.xml.sax.driver") == null) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.setProperty("org.xml.sax.driver",&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "org.apache.xerces.parsers.SAXParser");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // ドライバをロードします&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Class.forName("org.apache.commons.dbcp.PoolingDriver");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Connectionを取得します&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // "/sqlserver"のsqlserverは、sqlservelr.joclのファイル名から拡張子を除いたもの&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // スラッシュを忘れずに。&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; con = DriverManager.getConnection("jdbc:apache:commons:dbcp:/sqlserver");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; out.println("&amp;lt;P&amp;gt;成功！");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 必要に応じてsleepする&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Thread.sleep(待ち時間ミリ秒);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (Exception e) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; out.println("&amp;lt;P&amp;gt;ただいま接続が混雑しております");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.printStackTrace();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } finally {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; closeConnection(con);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; out.println("&amp;lt;/body&amp;gt;");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void closeConnection(Connection con) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (con != null) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; con.close();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (Exception e) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.printStackTrace();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;}&lt;BR&gt;&lt;BR&gt;
&lt;HR id=null&gt;
&lt;/P&gt;
&lt;P&gt;主役的な役割を果たすのは「排除スレッド」です。この排除スレッドは「排除スレッドの実行間隔」おきに実行され、アイドル状態の接続を「最小アイドル数」以上「最大アイドル数」以下に保ちます。&lt;BR&gt;アイドル状態接続が追加されるのはアイドル状態接続数が「最小アイドル数」を下回った時、削除されるのはアイドル状態接続数が「最大アイドル数」を上回った時です。&lt;BR&gt;またアイドル接続が「排除対象になるまでの最短時間」を上回っていた場合もアイドル接続を削除の対象にします。&lt;BR&gt;ただし、削除されることにより「最小アイドル数」を下回ってしまった場合、直ちに不足した分を追加します。&lt;BR&gt;また、検証用クエリを用いたコネクションのテスト（取得時、返却時、アイドル状態）も行います（指定されていた時のみ）。&lt;BR&gt;設定を間違えるとかえってシステムに負担をかけてしまうので注意が必要です。&lt;/P&gt;&lt;img src ="http://blogs.sqlpassj.org/masatotaniguchi/aggbug/10799.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>たにぐち</dc:creator><title>Solaris10からSQL Server 2000 (JDBC) その３</title><link>http://blogs.sqlpassj.org/masatotaniguchi/archive/2005/06/12/9573.aspx</link><pubDate>Sun, 12 Jun 2005 05:32:00 GMT</pubDate><guid>http://blogs.sqlpassj.org/masatotaniguchi/archive/2005/06/12/9573.aspx</guid><wfw:comment>http://blogs.sqlpassj.org/masatotaniguchi/comments/9573.aspx</wfw:comment><comments>http://blogs.sqlpassj.org/masatotaniguchi/archive/2005/06/12/9573.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.sqlpassj.org/masatotaniguchi/comments/commentRss/9573.aspx</wfw:commentRss><trackback:ping>http://blogs.sqlpassj.org/masatotaniguchi/services/trackbacks/9573.aspx</trackback:ping><description>&lt;P&gt;&lt;A href="http://blogs.sqlpassj.org/masatotaniguchi/archive/2005/05/23/9102.aspx"&gt;http://blogs.sqlpassj.org/masatotaniguchi/archive/2005/05/23/9102.aspx&lt;/A&gt;&lt;BR&gt;の続きです。&lt;BR&gt;&lt;BR&gt;今度はストアドプロシージャを実行してみました。&lt;BR&gt;runSqlメソッドを以下のように変更します（DBはNorthwindを使用しました。ストアド３は自作で、数値を戻すだけの簡単なものです）。&lt;/P&gt;
&lt;P&gt;
&lt;HR id=null&gt;
&lt;BR&gt;&amp;nbsp;&amp;nbsp; public void runSql() {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Connection con = getConnection();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (con != null) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // ストアド１：結果セット１個&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CallableStatement cstmt = con.prepareCall("{Call [dbo].[CustOrderHist] (?)}");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cstmt.setString(1, "OTTIK");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ResultSet rs = cstmt.executeQuery();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println("CustOrderHist");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (rs.next()) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(rs.getString("ProductName") + ":" + rs.getInt("Total"));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rs.close();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cstmt.close();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // ストアド２：結果セット複数&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cstmt = con.prepareCall("{Call [dbo].[sp_helpdb] (?)}");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cstmt.setString(1, "Northwind");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rs = cstmt.executeQuery();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 一つ目結果セット&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println("sp_helpdb 1");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (rs.next()) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(rs.getString("name") + ":" + rs.getString("db_size"));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rs.close();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // CallableStatementのgetMoreResultsメソッド&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // さらに結果セットがある場合はそれを取得する&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // あればtrueを返す&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cstmt.getMoreResults();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rs = cstmt.getResultSet();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 二つ目結果セット&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println("sp_helpdb 2");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (rs.next()) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(rs.getString("name") + ":" + rs.getString("filename"));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rs.close();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cstmt.close();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // ストアド３：戻り値付きストアド&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cstmt = con.prepareCall("{? = call [dbo].[test]}");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cstmt.registerOutParameter(1, Types.INTEGER);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cstmt.execute();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println("戻り値付き");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(cstmt.getInt(1));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cstmt.close();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (Exception ex) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ex.printStackTrace();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } finally {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; closeConnection(con);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp; } 
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;結果セットを返すストアドプロシージャも違和感なく処理できます。しかも複数結果セットもOKです。&lt;/P&gt;
&lt;P&gt;ちなみにプロファイラの結果は以下のようになりました。&lt;/P&gt;
&lt;P&gt;exec sp_executesql N'EXEC [dbo].[CustOrderHist] @P1 ', N'@P1 nvarchar(4000) ', N'OTTIK'&lt;/P&gt;
&lt;P&gt;exec sp_executesql N'EXEC [dbo].[sp_helpdb] @P1 ', N'@P1 nvarchar(4000) ', N'Northwind'&lt;BR&gt;&lt;BR&gt;exec sp_executesql N'EXEC @P1 = [dbo].[test]&amp;nbsp; ', N'@P1 int OUTPUT ', @P1 output&lt;BR&gt;select @P1&lt;/P&gt;
&lt;P&gt;今度は、sp_executesqlを使用しているようです。&lt;/P&gt;
&lt;P&gt;これと同じことをOracleでやろうとすると次のようになります。&lt;BR&gt;テーブルはおなじみのscottのempを使用します。&lt;/P&gt;
&lt;P&gt;oracle側ストアドプロシージャ 
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; CREATE OR REPLACE PACKAGE pkgEMP IS&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type emp_cursor is ref cursor return EMP%rowtype;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; procedure SelectEmp (key in number, rc1 in out emp_cursor, rc2 in out emp_cursor );&lt;BR&gt;&amp;nbsp;&amp;nbsp; END;&lt;BR&gt;&amp;nbsp;&amp;nbsp; /&lt;BR&gt;&amp;nbsp;&amp;nbsp; CREATE OR REPLACE PACKAGE BODY pkgEMP IS&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PROCEDURE SelectEmp (key in number, rc1 in out emp_cursor, rc2 in out emp_cursor ) IS&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BEGIN&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; open rc1 for select * from EMP where EMPNO = key;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; open rc2 for select * from EMP;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END SelectEmp;&lt;BR&gt;&amp;nbsp;&amp;nbsp; END pkgEMP;&lt;BR&gt;&amp;nbsp;&amp;nbsp; /&lt;/P&gt;
&lt;P&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;Java側&lt;/P&gt;
&lt;P&gt;
&lt;HR id=null&gt;
&amp;nbsp;&amp;nbsp; public void runSQL() {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Connection con = getConnection();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (con != null) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CallableStatement cstmt = con.prepareCall("{Call pkgEMP.SelectEmp (?, ?, ?)}");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cstmt.setInt(1, 7839);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cstmt.registerOutParameter(2, OracleTypes.CURSOR);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cstmt.registerOutParameter(3, OracleTypes.CURSOR);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cstmt.execute();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ResultSet rs1 = ((OracleCallableStatement)cstmt).getCursor(2);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ResultSet rs2 = ((OracleCallableStatement)cstmt).getCursor(3);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (rs1.next()) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(rs1.getString("ENAME") + ":" + rs1.getString("JOB"));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (rs2.next()) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(rs2.getString("ENAME") + ":" + rs2.getString("JOB"));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rs1.close();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rs2.close();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cstmt.close();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (Exception ex) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ex.printStackTrace();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } finally {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; closeConnection(con);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp; } 
&lt;HR id=null&gt;
SQL Serverの場合、ストアドが出力した結果セットはexecuteQueryの戻り値として取得するのに対して、Oraceleのほうはカーソルを出力パラメータとして受け取るんですね。&lt;BR&gt;Javaのお相手としてOracleが使われることが多いようですが、SQL Serverも結構いけそうです。いかがでしょうか？&lt;BR&gt;&lt;BR&gt;#Solaris版Eclipse、苦労の末ようやく慣れてきました(^^; 
&lt;P&gt;&lt;/P&gt;&lt;img src ="http://blogs.sqlpassj.org/masatotaniguchi/aggbug/9573.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>たにぐち</dc:creator><title>Visual Basic 6.0で、なるべくコードの変更を少なくして複数のデータベースに確実に対応できるようにする</title><link>http://blogs.sqlpassj.org/masatotaniguchi/archive/2005/06/10/9475.aspx</link><pubDate>Fri, 10 Jun 2005 01:16:00 GMT</pubDate><guid>http://blogs.sqlpassj.org/masatotaniguchi/archive/2005/06/10/9475.aspx</guid><wfw:comment>http://blogs.sqlpassj.org/masatotaniguchi/comments/9475.aspx</wfw:comment><comments>http://blogs.sqlpassj.org/masatotaniguchi/archive/2005/06/10/9475.aspx#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://blogs.sqlpassj.org/masatotaniguchi/comments/commentRss/9475.aspx</wfw:commentRss><trackback:ping>http://blogs.sqlpassj.org/masatotaniguchi/services/trackbacks/9475.aspx</trackback:ping><description>&lt;P&gt;谷口です&lt;/P&gt;
&lt;P&gt;Visual Basic 6.0で、なるべくコードの変更を少なくして複数のデータベースに確実に対応できるようにする方法についてです。&lt;BR&gt;方法は色々考えられると思いますが、ここではVBのインターフェース(Interface)継承を用いてみようと思います。オブジェクト指向を完全にサポートしていないVisual Basic 6.0ですが、やれるところまでやってみようというお話です。&lt;/P&gt;
&lt;P&gt;使用するDBはSQL Server 2000とOracleです。&lt;BR&gt;テーブルはOracleの、scottにあるempテーブルを用います。&lt;BR&gt;これを、SQL server 2000にインポートしました。&lt;BR&gt;&lt;STRONG&gt;&lt;FONT color=#ff0000&gt;※以下のソースコードはエラー処理などが省略してあり、完全ではありません。&lt;/FONT&gt;&lt;/STRONG&gt;&lt;BR&gt;このテーブルのレコードを保存するために、VO(Value Object)を用意します。&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' ソースコード(clsEmpVo)：クラスモジュール&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' Private 変数&lt;BR&gt;' 従業員番号&lt;BR&gt;&lt;/FONT&gt;Private m_lngEmpNo As Long&lt;BR&gt;&lt;FONT color=#008000&gt;' 従業員名&lt;BR&gt;&lt;/FONT&gt;Private m_strEname As String&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' 以下略&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' プロパティ&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Public Property Get EMPNO() As Long&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; EMPNO = m_lngEmpNo&lt;BR&gt;End Property&lt;/P&gt;
&lt;P&gt;Public Property Let EMPNO(lngEmpNo As Long)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_lngEmpNo = lngEmpNo&lt;BR&gt;End Property&lt;/P&gt;
&lt;P&gt;Public Property Get Ename() As String&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Ename = m_strEname&lt;BR&gt;End Property&lt;/P&gt;
&lt;P&gt;Public Property Let Ename(strEname As String)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_strEname = strEname&lt;BR&gt;End Property&lt;/P&gt;
&lt;P&gt;' 以下略（フィールド分同じものを作ります）&lt;BR&gt;
&lt;HR id=null&gt;
&lt;BR&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;次に、データアクセス用インターフェースクラスを定義します&lt;BR&gt;
&lt;HR id=null&gt;
&lt;BR&gt;&lt;FONT color=#008000&gt;' ソースコード(clsEmpDao)&lt;/FONT&gt; ：&lt;FONT color=#008000&gt;クラスモジュール&lt;/FONT&gt; 
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;Public Function SelectEmp(lngEmpNo As Long) As Collection&lt;/P&gt;
&lt;P&gt;End Function&lt;/P&gt;
&lt;P&gt;Public Function InsertEmp(EmpVo As clsEmpVo) As Boolean&lt;/P&gt;
&lt;P&gt;End Function&lt;/P&gt;
&lt;P&gt;Public Function UpdateEmp(EmpVo As clsEmpVo) As Boolean&lt;/P&gt;
&lt;P&gt;End Function&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;このクラスのメソッドの中身は実装しません。&lt;/P&gt;
&lt;P&gt;次にこれをImplementsしたSQL Server用クラスを作成します。&lt;BR&gt;（ADO接続用オブジェクトは定義済みとします）&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' ソースコード(clsEmpSQLServerDao)：クラスモジュール&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000&gt;&lt;STRONG&gt;Implements clsEmpDao&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Public Function &lt;STRONG&gt;clsEmpDao&lt;/STRONG&gt;_SelectEmp(lngEmpNo As Long) As Collection&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim cmd As New ADODB.Command&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim result As New Collection&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim rs As ADODB.Recordset&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt; ' Commandの設定&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; With cmd&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .ActiveConnection = adoSQLServerCon&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .CommandText = "SELECT * FROM EMP WHERE EMPNO = ?"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .CreateParameter , adInteger, adParamInput&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Parameters(0).Value = lngEmpNo&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End With&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; '&lt;FONT color=#008000&gt; SQLを実行して結果セットを取得します&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set rs = cmd.Execute&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt; ' Recordsetから、VOへ値を詰めます&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Do Until rs.EOF&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim EmpVo As clsEmpVo&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set EmpVo = New clsEmpVo&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' 修正2005/07/08&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ' ここで Dim EmpVo = New clsEmpVoとやると&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; '&amp;nbsp;EmpVoが使いまわされ、同じ値になってしまう&lt;/FONT&gt;&lt;FONT color=#008000&gt;&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EmpVo.EMPNO = lngEmpNo&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EmpVo.Ename = nvl(rs.Fields("ENAME"), "")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EmpVo.Job = nvl(rs.Fields("JOB"), "")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EmpVo.Mgr = nvl(rs.Fields("MGR"), 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EmpVo.HireDate = nvl(rs.Fields("HireDate"), 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EmpVo.Sal = nvl(rs.Fields("SAL"), 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EmpVo.Comm = nvl(rs.Fields("COMM"), 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EmpVo.DeptNo = nvl(rs.Fields("DEPTNO"), 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Call result.Add(EmpVo)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rs.MoveNext&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Loop&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt; ' 後始末&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; rs.Close&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set rs = Nothing&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt; ' 戻り値(VOのコレクション)の設定&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set clsEmpDao_SelectEmp = result&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;End Function&lt;/P&gt;
&lt;P&gt;Public Function &lt;STRONG&gt;clsEmpDao&lt;/STRONG&gt;_InsertEmp(EmpVo As clsEmpVo) As Boolean&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' 省略&lt;BR&gt;&lt;/FONT&gt;End Function&lt;/P&gt;
&lt;P&gt;Public Function &lt;STRONG&gt;clsEmpDao&lt;/STRONG&gt;_UpdateEmp(EmpVo As clsEmpVo) As Boolean&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt; ' 省略&lt;BR&gt;&lt;/FONT&gt;End Function&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;ポイントは先頭のImplements clsEmpDaoと、メソッド名の前にアンダーバーを使いインターフェースクラス名をつけることです。インターフェースクラスで定義されているメソッドは全て実装する必要があります。&lt;BR&gt;&lt;BR&gt;同じくOracle用を作成します。ここではoo4oを使用しています。&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' ソースコード(clsEmpOracleDao)：クラスモジュール&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Implements clsEmpDao&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Public Function &lt;STRONG&gt;clsEmpDao&lt;/STRONG&gt;_SelectEmp(lngEmpNo As Long) As Collection&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim oraDynaset As Object&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim result As New Collection&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' パラメータのキー(EMPNO)&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Const EMPNO As String = "EMPNO"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; '&lt;FONT color=#008000&gt; パラメータの定義&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; oraDatabase.Parameters.Add EMPNO, lngEmpNo, ORAPARM_INPUT&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; oraDatabase.Parameters(EMPNO).serverType = ORATYPE_NUMBER&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' Dynaset&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set oraDynaset = oraDatabase.CreateDynaset("SELECT * FROM EMP WHERE EMPNO = :EMPNO", 0&amp;amp;)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt; '&amp;nbsp;DynasetkaからVOへ値を詰めます&amp;nbsp;&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Do Until oraDynaset.EOF&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim EmpVo As clsEmpVo&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set EmpVo =&amp;nbsp;New clsEmpVo&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' 修正2005/07/08&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ' ここで Dim EmpVo = New clsEmpVoとやると&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; '&amp;nbsp;EmpVoが使いまわされ、同じ値になってしまう&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EmpVo.EMPNO = lngEmpNo&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EmpVo.Ename = nvl(oraDynaset.Fields("ENAME"), "")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EmpVo.Job = nvl(oraDynaset.Fields("JOB"), "")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EmpVo.Mgr = nvl(oraDynaset.Fields("MGR"), 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EmpVo.HireDate = nvl(oraDynaset.Fields("HireDate"), 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EmpVo.Sal = nvl(oraDynaset.Fields("SAL"), 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EmpVo.Comm = nvl(oraDynaset.Fields("COMM"), 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EmpVo.DeptNo = nvl(oraDynaset.Fields("DEPTNO"), 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Call result.Add(EmpVo)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; oraDynaset.MoveNextn 1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Loop&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' 後始末&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; oraDatabase.Parameters.Remove EMPNO&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; oraDynaset.Close&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set oraDynaset = Nothing&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' 戻り値(VOのコレクション)の設定&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set clsEmpDao_SelectEmp = result&lt;/P&gt;
&lt;P&gt;End Function&lt;/P&gt;
&lt;P&gt;Public Function &lt;STRONG&gt;clsEmpDao&lt;/STRONG&gt;_InsertEmp(EmpVo As clsEmpVo) As Boolean&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' 省略&lt;BR&gt;&lt;/FONT&gt;End Function&lt;/P&gt;
&lt;P&gt;Public Function &lt;STRONG&gt;clsEmpDao&lt;/STRONG&gt;_UpdateEmp(EmpVo As clsEmpVo) As Boolean&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' 省略&lt;BR&gt;&lt;/FONT&gt;End Function&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;
&lt;P&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;データベース変更時のコード変更を楽にするために次のようなクラスを作ります。&lt;BR&gt;プログラム中でEmpDaoクラスを作成する時は必ずこのクラスを使用するようにします。そうすることにより使用するデータベースをここで一括管理できます（他にもDaoクラスを作った時は全てここに生成関数を作ります）。ＤＢ接続のためのオブジェクト（clsEmpSQLServerDaoのadoSQLServerConやclsEmpOracleDaoのoraDatabase）についてはここでは詳しく扱いませんが、clsEmpDaoにプロパティを追加し(Property Set)、わたしてやるのがよいかもしれません。この方法は、この投稿のASP版&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.sqlpassj.org/masatotaniguchi/archive/2005/07/09/12119.aspx"&gt;http://blogs.sqlpassj.org/masatotaniguchi/archive/2005/07/09/12119.aspx&lt;/A&gt;&lt;BR&gt;&lt;BR&gt;で扱ってみました。&lt;BR&gt;&lt;/P&gt;
&lt;HR id=null&gt;
&lt;BR&gt;&lt;FONT color=#008000&gt;' ソースコード(clsScottDaoFactory) ：クラスモジュール&lt;/FONT&gt; 
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;Public Function EmpDao() As clsEmpDao&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim Emp As clsEmpDao&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' 変更の必要な箇所&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set Emp = New clsEmpSQLServerDao&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' Set Emp = New clsEmpOracleDao&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set EmpDao = Emp&lt;BR&gt;End Function&lt;BR&gt;&lt;BR&gt;&lt;FONT color=#008000&gt;' 他のDaoクラスの例&lt;BR&gt;&lt;/FONT&gt;Public Function DeptDao() As clsDeptDao&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' 略&lt;BR&gt;&lt;/FONT&gt;End Function&lt;/P&gt;
&lt;P&gt;
&lt;HR id=null&gt;
&lt;BR&gt;&lt;BR&gt;次はこれらのクラスの使用例です。&lt;BR&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' ソースコード（Form1）：フォームモジュール&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Private Sub Command1_Click()&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim result As Collection&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim ScottDaoFactory As New clsScottDAOFactory&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim EmpDao As clsEmpDao&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim EmpVo As clsEmpVo&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set EmpDao = ScottDaoFactory.EmpDao&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set result = EmpDao.SelectEmp(7839)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set EmpVo = result.Item(1)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Text1.Text = EmpVo.Ename&lt;BR&gt;&lt;BR&gt;End Sub 
&lt;HR id=null&gt;
&lt;BR&gt;従業員番号が'7839'のものを選択する簡単なコードですが、DBを変更する必要が出た時に加える修正は実装クラスさえ作成してあれば１行ですみます。InterfaceクラスclsEmpDaoは入れ物の役目をしていて、入れ物には「何をするか」の定義だけが書かれています。必要に応じて中身を入れ替えるという考え方です。&lt;BR&gt;DBによる違いは全て実装クラスで吸収できます。&lt;BR&gt;MDI子ウィンドウの管理など他にも応用例があります。&lt;img src ="http://blogs.sqlpassj.org/masatotaniguchi/aggbug/9475.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>たにぐち</dc:creator><title>Solaris10からSQL Server 2000 (JDBC) その２</title><link>http://blogs.sqlpassj.org/masatotaniguchi/archive/2005/06/01/9343.aspx</link><pubDate>Wed, 01 Jun 2005 02:46:00 GMT</pubDate><guid>http://blogs.sqlpassj.org/masatotaniguchi/archive/2005/06/01/9343.aspx</guid><wfw:comment>http://blogs.sqlpassj.org/masatotaniguchi/comments/9343.aspx</wfw:comment><comments>http://blogs.sqlpassj.org/masatotaniguchi/archive/2005/06/01/9343.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.sqlpassj.org/masatotaniguchi/comments/commentRss/9343.aspx</wfw:commentRss><trackback:ping>http://blogs.sqlpassj.org/masatotaniguchi/services/trackbacks/9343.aspx</trackback:ping><description>&lt;P&gt;&lt;A href="http://blogs.sqlpassj.org/masatotaniguchi/archive/2005/05/23/9102.aspx"&gt;Solaris10からSQL Server 2000 (JDBC) &lt;/A&gt;&lt;BR&gt;の続きです。&lt;/P&gt;
&lt;P&gt;runSQLメソッドを以下のように変更します。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; public void runSql() {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Connection con = getConnection();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (con != null) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PreparedStatement ps = &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; con.prepareStatement("SELECT * FROM 住所録 WHERE id = ?");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ps.setInt(1, 1);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ResultSet rs = ps.executeQuery();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (rs.next()) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String contactName = rs.getString("名前");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(contactName);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rs.close();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ps.close();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (Exception ex) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ex.printStackTrace();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } finally {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; closeConnection(con);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;ちなみに、見に行くのは「住所録」という日本語名のテーブルの、「名前」&lt;BR&gt;というフィールド。id = 1には「たにぐち」と入っています。&lt;/P&gt;
&lt;P&gt;結果は&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;接続成功！&lt;BR&gt;たにぐち&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;と無事に出力されました。どうやら日本語は大丈夫のようですね。&lt;/P&gt;
&lt;P&gt;以下プロファイラの出力です。PreparedStatementのパラメータが&lt;BR&gt;どのように処理されているか!？&lt;/P&gt;
&lt;P&gt;select @@MAX_PRECISION&lt;/P&gt;
&lt;P&gt;declare @P1 int&lt;BR&gt;set @P1=180150000&lt;BR&gt;declare @P2 int&lt;BR&gt;set @P2=4&lt;BR&gt;declare @P3 int&lt;BR&gt;set @P3=1&lt;BR&gt;declare @P4 int&lt;BR&gt;set @P4=-1&lt;BR&gt;exec sp_cursoropen @P1 output, N'SELECT * FROM 住所録 WHERE id = @P1', @P2 output, @P3 output, @P4 output, N'@P1 int ', 1&lt;BR&gt;select @P1, @P2, @P3, @P4&lt;/P&gt;
&lt;P&gt;exec sp_cursorfetch 180150000, 2, 1, 256&lt;/P&gt;
&lt;P&gt;exec sp_cursorfetch 180150000, 2, 1, 256&lt;/P&gt;
&lt;P&gt;exec sp_cursorclose 180150000&lt;/P&gt;
&lt;P&gt;API システム ストアド プロシージャを使用しています。&lt;BR&gt;このプロシージャは直接の呼出はサポートしていないそうです（なのでBooks Onlineにも&lt;BR&gt;使用方法は書かれていません）。&lt;BR&gt;ADO、OLE DB、ODBC、および DB-Library などから呼ばれると書いてありますが、&lt;BR&gt;JDBC Driverもこの中に入るようです。&lt;BR&gt;詳しくはBooks Online参照。&lt;/P&gt;
&lt;P&gt;ここで、Visual Basic 6.0の登場。ADOをつかいDSNで接続。&lt;/P&gt;
&lt;P&gt;Private Sub Command1_Click()&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim adoCon As New ADODB.Connection&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim cmd As New ADODB.Command&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim rs As New ADODB.Recordset&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; adoCon.ConnectionString = _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "DSN=********;DATABASE=xxxxxx;UID=sa;PWD=********"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; adoCon.Open&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; With cmd&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .ActiveConnection = adoCon&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .CommandText = "SELECT * FROM 住所録 WHERE id = ?"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .CreateParameter , adInteger, adParamInput&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Parameters(0).Value = 1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End With&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set rs = cmd.Execute&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Do Until rs.EOF&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Debug.Print rs.Fields("名前").Value&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rs.MoveNext&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Loop&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; rs.Close&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; adoCon.Close&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;プロファイラの結果は&lt;/P&gt;
&lt;P&gt;declare @P1 int&lt;BR&gt;set @P1=1&lt;BR&gt;exec sp_prepare @P1 output, N'@P1 int', N'SELECT * FROM 住所録 WHERE id = @P1', 1&lt;BR&gt;select @P1&lt;/P&gt;
&lt;P&gt;同様にAPI システム ストアド プロシージャを使っていますが、別なストアド(sp_prepare)を使っています。&lt;/P&gt;
&lt;P&gt;ADO.NETの場合は、確かsp_executesql。これならBooks Onlineに使い方が載っています。&lt;/P&gt;
&lt;P&gt;ううん、同じことをしているはずなのに色々ですね。&lt;/P&gt;
&lt;P&gt;それにしてもSolaris版(motif)Eclipseちょっと重いです。仕事で使うにはちょっとツラそう。&lt;/P&gt;&lt;img src ="http://blogs.sqlpassj.org/masatotaniguchi/aggbug/9343.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>たにぐち</dc:creator><title>Solaris10からSQL Server 2000 (JDBC)</title><link>http://blogs.sqlpassj.org/masatotaniguchi/archive/2005/05/23/9102.aspx</link><pubDate>Mon, 23 May 2005 03:58:00 GMT</pubDate><guid>http://blogs.sqlpassj.org/masatotaniguchi/archive/2005/05/23/9102.aspx</guid><wfw:comment>http://blogs.sqlpassj.org/masatotaniguchi/comments/9102.aspx</wfw:comment><comments>http://blogs.sqlpassj.org/masatotaniguchi/archive/2005/05/23/9102.aspx#Feedback</comments><slash:comments>18</slash:comments><wfw:commentRss>http://blogs.sqlpassj.org/masatotaniguchi/comments/commentRss/9102.aspx</wfw:commentRss><trackback:ping>http://blogs.sqlpassj.org/masatotaniguchi/services/trackbacks/9102.aspx</trackback:ping><description>&lt;P class=MsoNormal style="MARGIN: 0mm 0mm 0pt"&gt;&lt;SPAN lang=EN-US&gt;SQL Server 2000 &lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'HG Mincho Light J'; mso-ascii-font-family: Thorndale; mso-hansi-font-family: Thorndale"&gt;への&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt; Solaris&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'HG Mincho Light J'; mso-ascii-font-family: Thorndale; mso-hansi-font-family: Thorndale"&gt;からのアクセスついて考えてみます。&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0mm 0mm 0pt"&gt;&lt;SPAN style="FONT-FAMILY: 'HG Mincho Light J'; mso-ascii-font-family: Thorndale; mso-hansi-font-family: Thorndale"&gt;（ほかのプラットフォームでも同じでは？という声が聞こえてきそうですが。。&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0mm 0mm 0pt"&gt;&lt;SPAN style="FONT-FAMILY: 'HG Mincho Light J'; mso-ascii-font-family: Thorndale; mso-hansi-font-family: Thorndale"&gt;今回はとりあえず接続だけ&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'HG Mincho Light J'; mso-ascii-font-family: Thorndale; mso-hansi-font-family: Thorndale"&gt;）&lt;/SPAN&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0mm 0mm 0pt"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0mm 0mm 0pt"&gt;&lt;SPAN style="FONT-FAMILY: 'HG Mincho Light J'; mso-ascii-font-family: Thorndale; mso-hansi-font-family: Thorndale"&gt;使用したのは&lt;/SPAN&gt;&lt;A href="http://www.microsoft.com/downloads/details.aspx?FamilyID=9F1874B6-F8E1-4BD6-947C-0FC5BF05BF71&amp;amp;displaylang=ja"&gt;&lt;SPAN style="FONT-FAMILY: 'HG Mincho Light J'; mso-ascii-font-family: Thorndale; mso-hansi-font-family: Thorndale"&gt;「&lt;/SPAN&gt;SQL Server 2000 Driver for JDBC Service Pack 2 &amp;#8211; &lt;/A&gt;&lt;SPAN style="FONT-FAMILY: 'HG Mincho Light J'; mso-ascii-font-family: Thorndale; mso-hansi-font-family: Thorndale"&gt;&lt;A href="http://www.microsoft.com/downloads/details.aspx?FamilyID=9F1874B6-F8E1-4BD6-947C-0FC5BF05BF71&amp;amp;displaylang=ja"&gt;日本語」&lt;/A&gt;です&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'HG Mincho Light J'; mso-ascii-font-family: Thorndale; mso-hansi-font-family: Thorndale"&gt;。&lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0mm 0mm 0pt"&gt;
&lt;P class=MsoNormal style="MARGIN: 0mm 0mm 0pt"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;&lt;SPAN style="FONT-FAMILY: 'HG Mincho Light J'; mso-ascii-font-family: Thorndale; mso-hansi-font-family: Thorndale"&gt;&lt;BR&gt;セットアップ用のスクリプト&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;(install.ksh)&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'HG Mincho Light J'; mso-ascii-font-family: Thorndale; mso-hansi-font-family: Thorndale"&gt;がついています。このスクリプトは文字化けしている&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;EULA.txt&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'HG Mincho Light J'; mso-ascii-font-family: Thorndale; mso-hansi-font-family: Thorndale"&gt;を表示して&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;msjdbc.tar&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'HG Mincho Light J'; mso-ascii-font-family: Thorndale; mso-hansi-font-family: Thorndale"&gt;を解凍後指定ディレクトリにコピーしているだけです。&lt;/SPAN&gt; 
&lt;P&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0mm 0mm 0pt"&gt;&lt;SPAN lang=EN-US&gt;EULA&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'HG Mincho Light J'; mso-ascii-font-family: Thorndale; mso-hansi-font-family: Thorndale"&gt;は付属の&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;gedit&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'HG Mincho Light J'; mso-ascii-font-family: Thorndale; mso-hansi-font-family: Thorndale"&gt;で読むのが簡単です。&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0mm 0mm 0pt"&gt;&lt;SPAN lang=EN-US&gt;msjdbc.tar &lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'HG Mincho Light J'; mso-ascii-font-family: Thorndale; mso-hansi-font-family: Thorndale"&gt;を解凍してできた&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;lib&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'HG Mincho Light J'; mso-ascii-font-family: Thorndale; mso-hansi-font-family: Thorndale"&gt;配下の３つのファイル&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0mm 0mm 0pt"&gt;&lt;SPAN lang=EN-US&gt;msbase.jar&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0mm 0mm 0pt"&gt;&lt;SPAN lang=EN-US&gt;mssqlserver.jar&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0mm 0mm 0pt"&gt;&lt;SPAN lang=EN-US&gt;msutil.jar&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0mm 0mm 0pt"&gt;&lt;SPAN style="FONT-FAMILY: 'HG Mincho Light J'; mso-ascii-font-family: Thorndale; mso-hansi-font-family: Thorndale"&gt;を&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;CLASSPATH&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'HG Mincho Light J'; mso-ascii-font-family: Thorndale; mso-hansi-font-family: Thorndale"&gt;に追加したほうが手っ取り早いです。&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0mm 0mm 0pt"&gt;&lt;SPAN style="FONT-FAMILY: 'HG Mincho Light J'; mso-ascii-font-family: Thorndale; mso-hansi-font-family: Thorndale"&gt;（下図は&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;Solaris- motif&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'HG Mincho Light J'; mso-ascii-font-family: Thorndale; mso-hansi-font-family: Thorndale"&gt;版&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;Eclipse&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'HG Mincho Light J'; mso-ascii-font-family: Thorndale; mso-hansi-font-family: Thorndale"&gt;でライブラリに&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;SQL Server 2000 Driver for JDBC &lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'HG Mincho Light J'; mso-ascii-font-family: Thorndale; mso-hansi-font-family: Thorndale"&gt;を追加したところ。）&lt;/SPAN&gt;&lt;/P&gt;&lt;BR&gt;&lt;IMG src="/images/blogs_sqlpassj_org/masatotaniguchi/149/o_eclipse.jpg"&gt; 
&lt;P class=MsoNormal style="MARGIN: 0mm 0mm 0pt"&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0mm 0mm 0pt"&gt;&lt;SPAN style="FONT-FAMILY: 'HG Mincho Light J'; mso-ascii-font-family: Thorndale; mso-hansi-font-family: Thorndale"&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0mm 0mm 0pt"&gt;&lt;SPAN style="FONT-FAMILY: 'HG Mincho Light J'; mso-ascii-font-family: Thorndale; mso-hansi-font-family: Thorndale"&gt;テストは&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;Windows Server 2003&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'HG Mincho Light J'; mso-ascii-font-family: Thorndale; mso-hansi-font-family: Thorndale"&gt;上の&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt; SQL Server&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'HG Mincho Light J'; mso-ascii-font-family: Thorndale; mso-hansi-font-family: Thorndale"&gt;を使用しました。&lt;/SPAN&gt; &lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0mm 0mm 0pt"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0mm 0mm 0pt"&gt;以下テスト用ソースコード&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0mm 0mm 0pt"&gt;（main関数中で指定しているプロパティを環境に合わせて書き換えてください）&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0mm 0mm 0pt"&gt;---------------------------------------------------------------------------------------&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0mm 0mm 0pt"&gt;/*&lt;BR&gt;&amp;nbsp;* 作成日: 2005/05/23&lt;BR&gt;&amp;nbsp;*&lt;BR&gt;&amp;nbsp;*/&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0mm 0mm 0pt"&gt;package test;&lt;BR&gt;import java.sql.Connection;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0mm 0mm 0pt"&gt;/**&lt;BR&gt;&amp;nbsp;*&amp;nbsp; @author たにぐち&lt;BR&gt;&amp;nbsp;*　いろいろなSQLを走らせてみます&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0mm 0mm 0pt"&gt;&amp;nbsp;*&amp;nbsp; あくまでテスト用の簡易コードです。&lt;BR&gt;&amp;nbsp;*/&lt;BR&gt;public class MSSQLServer {&lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp; private final String MS_SQL_DRIVER_CLASS_NAME =&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "com.microsoft.jdbc.sqlserver.SQLServerDriver";&lt;BR&gt;&amp;nbsp;&amp;nbsp; private final String URL = "jdbc:microsoft:sqlserver://";&lt;BR&gt;&amp;nbsp;&amp;nbsp; private final String DEFAULT_PORT_NUMBER = "1433";&lt;BR&gt;&amp;nbsp;&amp;nbsp; private final String SELECT_METHOD = "cursor";&lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp; private String serverName;&lt;BR&gt;&amp;nbsp;&amp;nbsp; private String portNumber = DEFAULT_PORT_NUMBER;&lt;BR&gt;&amp;nbsp;&amp;nbsp; private String userName;&lt;BR&gt;&amp;nbsp;&amp;nbsp; private String password;&lt;BR&gt;&amp;nbsp;&amp;nbsp; private String databaseName;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp; /**&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param databaseName databaseName を設定。&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;BR&gt;&amp;nbsp;&amp;nbsp; public void setDatabaseName(String databaseName) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.databaseName = databaseName;&lt;BR&gt;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp; /**&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param password password を設定。&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;BR&gt;&amp;nbsp;&amp;nbsp; public void setPassword(String password) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.password = password;&lt;BR&gt;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp; /**&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param portNumber portNumber を設定。&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;BR&gt;&amp;nbsp;&amp;nbsp; public void setPortNumber(String portNumber) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.portNumber = portNumber;&lt;BR&gt;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp; /**&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param serverName serverName を設定。&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;BR&gt;&amp;nbsp;&amp;nbsp; public void setServerName(String serverName) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.serverName = serverName;&lt;BR&gt;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp; /**&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param userName userName を設定。&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;BR&gt;&amp;nbsp;&amp;nbsp; public void setUserName(String userName) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.userName = userName;&lt;BR&gt;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp; private Connection getConnection() {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Connection con = null;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Class.forName(MS_SQL_DRIVER_CLASS_NAME);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; con = java.sql.DriverManager.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; getConnection(getConnectionString(), userName, password);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (con != null) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&a