Cω再び・・・

なんかいろんな人が気にしてるみたいで、
それを読んでたらまた気になって、再びについて調査することに。

今回は、論文にだけでなくプレビュー版をちゃんと使ってようと決心。
データベースアクセスがどれくらい自然に行えるのがどうしても気になった。
やっぱ、使ってみないとわかんないよなぁと。

msi形式でダウンロードされているので、苦もなくインストール終了。

VS2003を立ち上げて新規プロジェクトの作成画面のプロジェクトの種類に
「Comega Projects」が追加されていることを確認。
選択できるプロジェクトは、

の4つで、とりあえずNorthwind Applicationを選択。

Comegaのソースファイルの拡張子は、プロジェクトの作成が完了すると、
Northwind.cwとAssemblyInfo.cwの二つのファイルが作成される。
まずは、ソースファイルを見てみようと思いNorthwind.cwを開く。

すると、

using System;
using Northwind;


というusingステートメントが。。。
なんだこれはと一瞬戸惑ったのだが、よくよく調べてみると
アセンブリの参照に「Northwind.dll」というのがあり、これを参照している
だけだった。一瞬、DBを直接参照かよとあせってしまった自分が恥ずかしい。
ちなみに、このNorthwind.dllはNorthwindデータベースのスキーマを型システムに
取り込んだもので、ソリューションエクスプローラのReferencesを選択し、
コンテキストメニューを開くと「Add Database Schema」というメニューが
増えているのでそこから作成し、参照することができる。

で、自動生成されたプログラム本体を見てみる。

public static void Main( string[] args ) {
	String connectstring = "Data Source=(local); Initial Catalog=Northwind; Connect Timeout=5; Integrated Security=SSPI";
	Database dbo = new Database(connectstring);

	string mycity = args.Length>0 ? args[0] : "London";
	Console.WriteLine("Contacts in \"{0}\"", mycity);
	Console.WriteLine();
	Console.WriteLine("CustomerID   Contact");
	Console.WriteLine("--------------------------------------------");
			
	// Comega allows variables to be declared without the "type".  It
	// infers the type from the right hand side of the assignment.
	res = select CustomerID, ContactName 
		  from dbo.Customers 
		  where City == mycity 
		  order by ContactName;
	
	// The same type inference applies inside the foreach expression.
	foreach( row in res) {		                
		Console.WriteLine("{0,-12} {1}",
                               row.CustomerID, row.ContactName);
	}
	Console.Write("\nPress any key to continue...");
	Console.In.ReadLine();
	return;
}

これは、NorthwindデータベースからCityがLondon(もしくは、引数で与えられた都市名)に
一致する顧客IDとその担当者の一覧を表示するプログラムである。

このプログラムでまあたらしいのは、やはりselect構文だろうか。
C#のstring型オブジェクトであるmycityがwhere節においてCustomersテーブルのCity列と
==演算子で結合されているは、データベースのスキーマC#の型がうまく融合されている
からだと言えよう。ちなみに、次のように書くと型検査に失敗し、コンパイルエラーになる。

int wrongTypedCity = 0;
res = select CustomerID, ContactName 
	  from dbo.Customers 
	  where City == wrongTypedCity
	  order by ContactName;

ここまでで個人的に微妙だなと思ったのは、
上記のような型エラーを検出できるのはあくまでNorthwindデータベースのスキーマ
取り込んだアセンブリがあるからであってそのアセンブリと実際のデータベースの間で
同期がとられている事を開発者がつねに注意していなければならない点である。
コンパイル時に直接データベースを参照するわけにもいかないし、
現実的な解なのかなと思いつつもどうにかならないものかとも思ってしまう。