【B4】Delphi Prismチュートリアルセッション

Delphi Prism による Blackfish SQL を利用したWebサービス／ASP.NETアプリケーションの作成
株式会社ドリームハイブ
代表取締役 山本 悟

スピーカープロフィール
山本 悟：：略歴：：
17歳からコンピュータ関係にはまり、プログラミング言語で一番最初に触ったのはTurbo C++でした。
大学卒業後、そのまま起業しましたが、今でも自分勝手に創るのが一番好きです。
現在の開発案件では、主に.NETとPHPを利用しています。
Delphiとは1.0で出会い、バイト先のゲーム会社のサポートプログラムを作成したりしていました。
現在も、ちょっとしたプログラムはDelphiで作ることが多く、最後のスライドでご紹介するDHAPPLIももちろんDelphi製です。
現在はPM系や言語系といったIT系のトレーニングを多くやっていますが、昔テレビ埼玉でパソコンの先生をしていたこともあります。
http://www.dreamhive.co.jp/
http://dhive.jp/blog/yama/
http://mixi.jp/show_friend.pl?id=1043572

アジェンダ• このセッションの成果物と前提知識• 早速作りましょう• WebサービスとWebアプリケーション• DBに繋げる場合• Blackfish SQLを使います• 終わりにz このセッションは、テクニカル・チュートリアルセッションですz Delphi PrismとBlackfish SQLを利用した、WebサービスとWebアプリケーションを実装します
z 開発環境から運用環境に移行する際のポイントを紹介しますz あなたにとって最適解では無いかもしれませんが、参考になると思います

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

3

このセッションの成果物と前提知識

このセッションの成果物• データベースの結果を返すWebサービス• Webサービスに接続して、画面を表示するWebアプリケーション
1.DBのデータを返すWebサービス

ネットワーク

利用者

HTTP
HTML

ネットワークWebアプリケーション

SOAP
XML

Webサービス

データベース

2.DBのデータを受け取るWebアプリケーション

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

5

前提知識

• Webサービス
XML Web サービスとは、XML、HTTP、SOAP などのインターネット標準技術を利用して、異なるプラットフォーム上のアプリケーションとも統合することが可能なソフトウェアの総称です(MSDNから)
UDDI

1)サービスの検索

あらかじめWebサービスを登録※WSDLなどを利用する

ネットワーク

利用者2)サービスの利用

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

Webサービス6早速作りましょう早速作りましょうの構成

1. まずは簡単なWebサービスから
2. Webサービスに接続するWebアプリケーション
1.簡単なWebサービス

ネットワーク

利用者

HTTP
HTML

ネットワークWebアプリケーション

SOAP
XMLWebサービス

2.Webサービスに接続するWebアプリケーション

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

8

早速作りましょう - その1• まずは簡単なWebサービスから•[ファイル|新規作成|Web サイト]から「ASP.NET Webサービス」を選択、言語はもちろん「Oxygene」••

Methodのimplementation部には「[WebMethod]」を忘れずに
App_Codeのpasファイル名やクラス名を変更するときは、
asmxファイルのWebServiceディレクティブのCodeBehind属性とClass属性を合わせること本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

9早速作りましょう - その1のソース■ /Service.asmx<%@ WebService Language="Oxygene" CodeBehind="~/App_Code/Service.pas
Service.pas" Class="ServiceService" %>■ /App_Code/Service.pas
Service.pas
type[WebService(&Namespace := 'http://tempuri.org/http://tempuri.org/')]Service = public class(System.Web.Services.WebService)
publicmethod HelloWorld: string;
method GetSum(a, b: Integer): Integer;end;
implementation[WebMethod]
method Service.HelloWorld: string;
begin
result := 'Hello World';
end;[WebMethod]
method Service.GetSum(a, b: Integer): Integer;
begin
result := a + b;
end;

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

10

早速作りましょう - その2• Webサービスに接続するWebアプリケーション• [ファイル|追加|新しいWebサイト]から「ASP.NET Web サイト」を選択• [Web サイト|Web 参照の追加]を選択、プロジェクトにWeb 参照を追加• TextBoxを2つ、Buttonを1つフォームに配置• ButtonのClickイベントに、GetSum()を利用したコードを記述

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

11

早速作りましょう - その2のソース■ /Default.aspx.pas
method _Default.Button1_Click(sender: System.Object; e: System.EventArgs);var
ws: localhost. Service;
beginws := new localhost. Service;
Button1.Text := ws.GetSum(Integer.Parse(TextBox1.Text), Integer.Parse(TextBox2.Text)).ToString;end;

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

12

問題点

1. 運用環境にOxygeneは入っているか？
•VB.NETやC#は、.NET Frameworkのインストール時に利用できるように構成されているが、Oxygene(Delphi Prism)は構成されていない•/Default.aspx のディレクティブ<%@ Page Language="Oxygene" AutoEventWireup="true"
CodeFile="Default.aspx.pas" Inherits="_Default" %>2. WebサービスはUDDIが前提になっているから、サーバの特定ができないのでは？
•Web参照で追加された、wsdl / disco ファイルのどちらにもWebサービスへのURLが直接記述されている本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

13

解決方法

1. プリコンパイルしておくのが簡単•[ビルド|Web サイトの発行]を選択し、「このプリコンパイルされたサイトを更新可能にする」チェックボックスのチェックを外す•

運用環境にOxygeneをインストールする方法もある

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

14

解決方法

2. Wsdl.exeを利用する
Webサービス接続用のプロクシクラスをWsdl.exeで作成し、サーバ情報はWeb.config
ファイルに外出ししてしまう
1.「ソリューション エクスプローラ」でクラスファイルを作りたいプロジェクトを選択し、右クリックメニューの「ASP.NET フォルダの追加」から、「App_Code」を選択する
2.「Visual Studio 2008 コマンドプロンプト」を立ち上げ、手順1の App_Code フォルダに移動する
3.「Wsdl.exe /urlkey:<構成キー名> /l:<言語名> <URL>」を入力、実行<構成キー名>:Web.config の appSettings セクションで指定したい名前<言語名>:クラスファイルを記述する言語名(C# や Oxygene など)＜URL>:Web サービス提供の URL (～.asmx など)
例) wsdl.exe /urlkey:ws /l:Oxygene http://localhost:55555/<WebSite>/Service.asmx
4.Web.config内の「<configuration>¥<appSettings>」に「構成キー」を追加
例)<add key=“ws” value=“http://localhost:55555/<WebSite>/Service.asmx"/>

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

15

解決方法 – ソース■ /Web.config<configuration>↓ ここに運用環境のWebサービスのURLを記述する<appSettings><add key=“wsws" value="http://localhost:55555/<WebSite>/Service.asmx
http://localhost:55555/<WebSite>/Service.asmx"/></appSettings></configuration>■ /App_Code/Service.pas
constructor Service;
begin
var urlSetting: System.String := System.Configuration.ConfigurationManager.AppSettings[‘wsws'];
if (urlSetting <> nil) then begin
self.Url := urlSetting;endelse begin
self.Url := 'http://localhost:55555/<WebSite>/Service.asmx';
end;
end;

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

16

DBに繋げる場合

DBに繋げる場合の構成

1. DBのデータを返すWebサービスを作る
2. DBのデータを受け取るWebアプリケーションを作る
1.DBのデータを返すWebサービス

ネットワーク

利用者

HTTP
HTML

ネットワークWebアプリケーション

SOAP
XML

Webサービス

データベース

2.DBのデータを受け取るWebアプリケーション

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

18

DBに繋げる場合 – その1• DBのデータを返すWebサービスを作る
1. DBファイルを「/App_Data」に配置する(作成する)
1.

2.

「ツール|データベースへの接続」を選択し、「データソース」を「BlackfishSQL」に、「データ プロバイダ」をBlackfish SQL Remote Data Provider
for .NET」に設定し、「続行」する
接続情報を入力し、「OK」をクリックする
新規に作成する場合は、「詳細設定」で「Create=True」にする
例)host=LocalHost;user=sysdba;password=masterkey;database=“Path¥To¥App_Data¥TestData“

3.

※「SQLウィンドウ」もしくは「クエリ」で、SQLのチェックなどができる
Web.config に<connectionString>を追加する

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

19

DBに繋げる場合 – その1 – 画面

新規にDBを作る場合に必要な設定

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

20

DBに繋げる場合 – その1
2.

[表示|プロパティ ページ]を開き、「参照設定」で「Borland.Data.BlackfishSQL.RemoteClient」を追加する

3.

/App_Code/Service.pasのusesにデータアクセス用の名前空間を足す
••
••

4.
5.

System.Data,
System.Data.Common,
System.Data.SqlClient,
Borland.Data.DataStoreWeb.configのconnectionStringを取得するconstructorを追加/App_Code/Service.pasにDataTable型を戻り値としたGetTableメソッドを追加

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

21DBに繋げる場合 - その1

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

22

DBに繋げる場合 - その2• DBのデータを受け取るWebアプリケーションを作る
1. プロキシクラスをWsdl.exeによって更新する(再作成する)
2. フォームにGridViewを1つ配置する
3. GridViewにWebサービスから返されるDataTableをDataSourceプロパ
ティに代入し、DataBindメソッドを呼び出すコードを、Page_Loadイベン
トなどに記述する

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

23

DBに繋げる場合 - その2 - ソース■Default.aspx.pas
method _Default.Page_Load(sender: Object; e: EventArgs);var
ws: Service;
begin
ws := new Service;
GridView1.DataSource := ws.GetTable;
GridView1.DataBind;
end;

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

24

問題点

1. Blackfish SQLには接続(コネクション)数の制限がありませんでしたっけ？
• Professional版は、1ユーザー／4コネクション、512 MBデータベースサイズをサポートするBlackfish SQLデスクトップデータベースの無制限配布
ライセンス• Enterprise／Architect版は、5ユーザー／20コネクション、2 GBデータベースサイズをサポートするBlackfish SQLデータベースの無制限配布ライセンス

2. 問題が起きているのはDB？どうやってチェックする？
3. 配布は簡単？

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

25

解決方法

1. きちんと毎回接続を切りましょう•

複数のクライアントから接続される可能性が高いのであれば「リモート接続」を利用し、毎回コネクションを切りましょう→Blackfish SQLはサービスで起動する必要がある
例)毎回コネクションを切るコード
begin
for n: Integer := 0 to 30 do begin
using conn: DataStoreConnection := new
DataStoreConnection('host=localhost;database=path¥to¥TestData.jds;user=sysdba;password=masterkey" providerName="Borland.Data.BlackfishSQL.RemoteClient') do beginconn.Open();conn.Close();end;end;end;

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

26

解決方法
2. Blackfish SQLにもログ(システム ログ)機能があります•C:¥Program Files¥CodeGear¥Delphi Prism¥Bin¥BSQLServer.exe.config ファイル内の次の値を設定します••<configuration>¥<appSettings>¥<add key=blackfishsql.logFile” value=“ログファイルのパス”><configuration>¥<appSettings>¥<add key=blackfishsql.logFilters” value=“ログのフィルタ文字列”>–•

フィルタ文字列
INIT,CONNECT,PREPARE,SET_PARAMETER,EXECUTE,TRANSACTIONS,ERRORS,LOCK_ERRORS,SYSTEM※Blackfish SQLがサービスで起動している場合は、サービスを再起動させる必要があります

3. 本番環境への配布方法•

配布するファイル
••
•
•
•

•

DBプロバイダへのアセンブリ登録(DbProviderFactories)
••
•
•

•

BSQLServer.exe
BSQLServer.exe.config(設定ファイル：必要があればコピーして編集、設定する)
Borland.Data.BlackfishSQL.RemoteClient.dll
Delphi Prism BlackfishSQL.slip/App_Data内のデータベースファイル(本体、ログなど)
Web アプリケーションごとに設定するなら「Web.config」ファイルへ登録
Web サーバで一括して設定する設定なら、「Machine.config」ファイルへ登録
C:¥WINDOWS¥Microsoft.NET¥Framework¥<バージョン>¥CONFIG¥Machine.config<configuration>¥<system.data>¥<DbProviderFactories>

SCコマンドを使えば、配布時のサービス設定を自動化できます

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

27

SCコマンド■コマンド例

sc failure "BlackfishSQL" reset= 900 actions= restart/180000/restart/180000/restart/180000

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

28

それと
• App_Dataフォルダのセキュリティ設定• Blackfish SQLデータベースのファイルを保存する「App_Data」のフォルダ・ファイルのセキュリティ設定には、ASP.NETの動作アカウントを追加する必要があります• ASP.NETの動作アカウントはOSによって違いますが、Windows XP では「ASP.NET」、Windows Server 2003 では「NETWORK SERVICE」ユーザとなっています• ASP.NETの動作アカウントへのアクセス許可には、「変更」を追加しましょう• 名前空間の設定• /App_Code/Service.pas内の[WebService(&Namespace := ‘http://tempuri.org/’)]は、http://tempuri.org/
自社のURL等を指定しましょう※tempuriのままだと警告メッセージが出ます

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

29

終わりに

終わりに

• ご協力いただいた方• 株式会社クリエ・イルミネート 溝端氏
http://www.crie-illuminate.jp/• WCFやUDDIなどの情報を教えていただきました• DEKO(深夜の誤爆)氏• Blackfish SQLの配布についてなどの情報を教えていただきました

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

31

会社紹介

「日本一相談しやすい中小企業向けITコンサルティング」を目指す「システム開発」会社です。

商号

株式会社ドリームハイブ

設立

2001年12月4日

3つの事業を組み合わせることにより、中小企業が抱えるIT関連の負荷を軽減し、仕事を楽にするサービスを提供しています

事業内容概要図

このスライドを見たらアクセスしてみてください → http://www.dreamhive.co.jp/

32

公開アプリの紹介

アプリ• DH-APPLI•••••M – シンプルなメモツール
Change! –お手軽名前変更ツール
GrepReplace –複数行一括置換
PlacesBar – ダイアログを便利に！
ColorPicker – 色情報取得ツール•

VALUE-DOMAIN 専用 DNS更新ツール• その他

累計70,000件以上のダウンロード！

アプリが目指すもの

33

アプリの配布先•

自社Web
http://dhive.jp/dhappli/•Vector
http://www.vector.co.jp/vpack/browse/person/an037127.html•窓の杜
http://www.forest.impress.co.jp/lib/sys/file/filesearch/grprplc.html

34