特集
NetDictionaryで始める
Webサービス・プログラミング

4.ICD Webサービスのデータベース処理


デジタルアドバンテージ
2002/02/06


 ここまでに解説したADO .NETによるデータベース・アクセスの処理方法を用いて、ICD Webサービスに必要なデータベース処理を行うコンポーネントを記述することができる。次のリストがこのコンポーネントのソースコードだ(ただしリストが少し長いため、解説用に多くの部分を省略している。完全なソースコードはこちら(icddb.cs)を参照していただきたい)。

  1: // icddb.cs
  2:
  3: using System;
  4: using System.Data;
  5: using System.Data.SqlClient;
  6:
  7: public class WORD {
  8:   public string title;
  9:   public string id;
 10:   public string english;
 11:   public string japanese;
 12:
 13:   public WORD(string title, string id, string english, string japanese) {
 14:     this.title    = title;
 15:     this.id       = id;
 16:     this.english  = english;
 17:     this.japanese = japanese;
 18:   }
 19:
 20:   public WORD() {
 21:     ;
 22:   }
 23:
 24:   public void dump() {
 25:     Console.WriteLine(this.id + " - " + this.title);
 26:   }
 27: }
 28:
 29: public class WEBPAGE {
 30:   public string title;
 31:   public string url;
            ・・・
 46: }
 47:
 48: public class ICDDB {
 49:   private DataSet makeDs(string sql) {
 50:
 51:     DataSet ds = new DataSet();
 52:
 53:     SqlConnection conn
 54:       = new SqlConnection(
 55:        "server=webservice02;uid=icduser;pwd=icdpw;database=ICD"
 56:       );
 57:     SqlDataAdapter da = new SqlDataAdapter(sql, conn);
 58:     da.Fill(ds);
 59:
 60:     return ds;
 61:   }
 62:
 63:   public WORD[] GetWordsByTitle(string title, bool partial) {
            ・・・
106:   public WORD GetWordById(string id) {
107:
108:     string sql = String.Format(@"
109:         select
110:           t.[見出し語名],
111:           t.[ID],
112:           t.[欧文読み],
113:           t.[日本語読み]
114:         from
115:           [見出し語名] t,
116:           [説明] d,
117:           [R見出し語名_説明] rd
118:         where
119:                t.[ID]     = '{0}'
120:           and  t.[ID]     = rd.[見出し語名ID]
121:           and rd.[説明ID] =  d.[ID]
122:           and  d.[有効]   = 1
123:       ", id);
124:
125:     DataSet ds = makeDs(sql);
126:     if (ds == null) {
127:       return null;
128:     }
129:     int num_words = ds.Tables[0].Rows.Count;
130:     if (num_words == 0) {
131:       return null;
132:     }
133:     return new WORD(
134:           ds.Tables[0].Rows[0][0].ToString(),
135:           ds.Tables[0].Rows[0][1].ToString(),
136:           ds.Tables[0].Rows[0][2].ToString(),
137:           ds.Tables[0].Rows[0][3].ToString());
138:   }
139:
140:   public string GetMeaningById(string id) {
            ・・・
205:   public WORD[] GetRefsById(string id) {
            ・・・
255:   public WORD[] GetAliasesById(string id) {
            ・・・
311:   public string GetUrlById(string id) {
            ・・・
329:   public static void Main(string[] args) {
330:     ICDDB icddb = new ICDDB();
331:     WORD[] words = icddb.GetWordsByTitle(args[0], false);
332:
333:     words[0].dump();
            ・・・
374:   }
375: }
データベース処理コンポーネントのソースコード(抜粋)
ICD Webサービスにおけるデータベース処理はすべてこのコンポーネントで行っている。

 プログラムの冒頭部分で定義しているWORDクラスは、1つの見出し語を表すこのコンポーネントの基本データ構造で、見出し語名のほかにそのIDと英文読み、日本語読みを含んでいる。

   7: public class WORD {
   8:   public string title;
   9:   public string id;
  10:   public string english;
  11:   public string japanese;

 そしてICDDBクラスは、次の6つのメソッドを提供している。

public WORD[] GetWordsByTitle(string title, bool partial)
public WORD GetWordById(string id)
public string GetMeaningById(string id)
public WORD[] GetRefsById(string id)
public WORD[] GetAliasesById(string id)
public string GetUrlById(string id)

 各メソッドでの処理は、そのメソッド名からおおよそ予想がつくだろう。GetWordsByTitleメソッドは、指定された文字列を検索して、見つかったすべての見出し語を返すメソッドである。第2引数である“partial”には、部分一致による検索のOn/Offを指定する。ここに“true”を指定した場合、見出し語名の一部に検索文字列を含むような見出し語をすべて列挙する。GetWordsByTitleメソッド以外のメソッドで引数となっているidは、ユニークな見出し語のIDである。

 少し余談になるが、プログラム内でのSQL文の記述にはC#のverbatim文字列(verbatimは「一字一句変えずに」という意味)を使用している。これはダブル・クオーテーションの前に“@”を付けることによって、ソースコードに記述したままの文字列を生成することができる機能だ。

108: string sql = String.Format(@"
109:     select
110:       t.[見出し語名],
111:       t.[ID],
112:       t.[欧文読み],
113:       t.[日本語読み]
114:     from
115:       [見出し語名] t,
116:       [説明] d,
117:       [R見出し語名_説明] rd
118:     where
119:            t.[ID]     = '{0}'
120:       and  t.[ID]     = rd.[見出し語名ID]
121:       and rd.[説明ID] =  d.[ID]
122:       and  d.[有効]   = 1
123:   ", id);

 プログラムでSQL文やHTML文のような長くなりがちな文字列定数を扱う場合、エディタの一行に収まらなかったり、複数の文字列に分割して連結したりして見栄えが悪くなることがよくある。このような場合にverbatim文字列は非常に便利だ。もちろん文字列には改行コードが含まれてしまうが、SQL文では特に問題にならない。

 ソースコードの最後では、Mainメソッドを記述し、このコンポーネントの簡単な単体テストを行うためのコードを追加している。このようなコードを付けておけば、ほかのプログラマがこのコードを利用する場合の参考にもなる。

 さて今回は、ICD Webサービスのデータベース処理のためのコンポーネントを作成したが、すでにこれでICD Webサービスの約80%はできあがっている。次回は、Webサービスとして公開するメソッドを作成し、最初のバージョンのICD Webサービスを完成させる予定だ。End of Article

 

 INDEX
  [特集]NetDictionaryで始めるWebサービス・プログラミング
  第4回 辞書データベースへのアクセス
    1.ヘルプ・ページのテンプレート
    2.ICDデータベースの構造
    3.ADO .NETによるデータベース・アクセス
  4.ICD Webサービスのデータベース処理
 
 特集 : NetDictionaryプロジェクト


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間