ページ

2011年4月3日日曜日

◆LINQでリンクテーブルのデータ件数を抽出条件に使う

以下はPubsデータベースのauthorsテーブルとtitleautherテーブルの関係である。

20110403205012 

authorsテーブルにぶら下がっているtitleauthorの件数をカウントすることによって、その著者が何冊の(何種類の)本を出版しているかが判る。

そこで2種類の本を出版している著者を抽出するには以下のようなLINQが記述できる。

            using (PubsDataContext pubs = new PubsDataContext())
{
var authors = pubs.authors.Where(a => a.titleauthor.Count == 2)
.Select(b => new
{
b.au_id,
b.au_fname,
b.au_lname,
titleCount = b.titleauthor.Count
});
form.dataGridView1.DataSource = authors;
}

3行目でその抽出条件を指定している。
ここで、aはauthorsテーブルの1件(行)に対するオブジェクト。そしてそのリンク(リレーション)先であるtitleauthor(au_idの等しいtitleauthorレコードの集まり)はそのものズバリのtitleauthorプロパティで参照することができる。
なので、その件数としてCountプロパティが2件のものといった指定が可能になっている。


ここらへんの機能(便利さ)がLINQの売りの一つではなかろうか。
本来ならば以下の様なサブクエリーを使った比較的面倒なSQLが必要になる。
(実際に発行されているSQLを表示)


SELECT [t0].[au_id], [t0].[au_fname], [t0].[au_lname], (
SELECT COUNT(*)
FROM [dbo].[titleauthor] AS [t2]
WHERE [t2].[au_id] = [t0].[au_id]
) AS [titleCount]
FROM [dbo].[authors] AS [t0]
WHERE ((
SELECT COUNT(*)
FROM [dbo].[titleauthor] AS [t1]
WHERE [t1].[au_id] = [t0].[au_id]
)) = @p0
-- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [2]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.1

私はSQLが得意な方ではないのでこれは非常に助かる。


参考までに埋め込みクエリー方式では以下のようになる。


            using (PubsDataContext pubs = new PubsDataContext())
{
var authors = from a in pubs.authors
where a.titleauthor.Count == 2
select new
{
a.au_id,
a.au_fname,
a.au_lname,
titleCount = a.titleauthor.Count
};

form.dataGridView1.DataSource = authors;
Console.Beep();
}

◆LINQで.NetクラスのプロパティやメソッドをWhere条件に使う

LINQでWhere条件(だけではないが)を記述するときに、そのデータ型のプロパティやメソッドを使うことができる。
以下はそのサンプルである。

                switch (form.comboBox1.SelectedIndex)
{
case 0:
var authors0 = pubs.authors.Where(a => a.state == "CA" && a.contract == true);
bindData(form, authors0);
break;
case 1:
var authors1 = pubs.authors.Where(a => a.au_fname.Length ==5 );
bindData(form, authors1);
break;
case 2:
var authors2 = pubs.authors.Where(a => a.au_fname.EndsWith("e"));
bindData(form, authors2);
break;
case 3:
var employee1 = pubs.employee.Where(e => e.hire_date >= new DateTime(1989, 1, 1) && e.hire_date <=
new DateTime(1990, 12, 31))
.Select(e => new
{
e.emp_id,
e.fname,
e.hire_date,
e.job_id,
e.job_lvl,
e.jobs,
e.lname,
e.minit,
e.pub_id
});
bindData2(form, employee1);
break;
case 4:
var employee2 = pubs.employee.Where(e => e.hire_date.Year == 1993);
bindData2(form, employee2);
break;
default:
break;
}

まず8行目でau_fname(string型)のLengthプロパティを使っている。
12行目では同じくstring型のEndsWithメソッド。
33行目ではhire_date(datatime型)のYearプロパティを使っている。


このようにLINQでは.NETFrameworkの機能を使ったコーディングが可能になっている。
当然、最終的にはSQLに変換されるわけなのでSQLに該当する関数がないような物については使えないのだが、基本的なものはかなりサポートされているようである。

◆LINQで抽出(Where)

とりあえずデータ抽出のためにフォームモジュールに書いたコードは以下のとおり。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
using(NorthWinds.NorthWindsDataContext nwds = new NorthWinds.NorthWindsDataContext())
{
var selectCustomer = nwds.Customers.Where(c => c.Country == "USA");
dataGridView1.DataSource = selectCustomer;
}
}
}
}

まずはusing句でNorthWindsDataContextクラスのインスタンスを作っている。
これは、dbmlファイル(のコードビハインドファイル)で自動生成されたクラスで、私の簡単な解釈ではNorthWindsデータベースへの接続を行い、NorthWindsデータベースを扱うためのクラス(オブジェクト)群に対する参照の入り口(環境)になる。
まぁ、そういうお決まりの手続と思って良いのではないだろうか。ここでは、dbmlをNorthWindsフォルダに置いたのでネームスペースで修飾しているが通常のDBへアクセスする場合はネームスペースの指定は不要だろう。


実際にテーブルからデータを抽出しているのが23行目。
LINQには拡張メソッド方式と埋め込みクエリー方式の2つの書き方があり、ここで使っているのは拡張メソッド方式の方である。
拡張メソッド方式は、WhereメソッドやSelectメソッドを繋ぎあわせて記述し、その中をデータ(オブジェクト)がパイプラインで流れていくようなイメージである。
私はPowershellをよく使うのだが、Powershellでパイプラインを繋ぎあわせてオブジェクトを処理していくのと全く同じイメージで非常に分かりやすい。


一方の埋め込みクエリー方式はLINQを通常のSQLっぽい文法に近づけた物。
普段Powershellを使っていなくて、SQLバリバリの人はこちらのほうが幾分分かりやすいのかもしれない。
ただし、コンパイル時には拡張メソッド方式に変換されるようなので基本は拡張メソッド方式と思ったほうが良いだろう。
特に、埋め込みクエリー方式では実現できない処理とかも若干あるようだ。


個人的には埋め込みクエリー方式なんてなくても良かったのにと思う。
自分で書くときは、どちらか一方を覚えていれば事足りるのだが、他人の書いたソースやWEBの情報を見るときにはどちらで書かれているか分からなので結局ある程度両方理解する必要が生じてしまう。
ただでさえ、最近は新しい文法が増えていて、VBでサンプルが書かれていると読みづらくなりつつあるというのに・・・・。


話を上記ソースに戻すと、23行目はNorthWindsデータベースのCustomersテーブルからWhereで指定した条件に合致するデータを取得するよって事。
抽出条件はラムダ式と呼ばれる記法で書かれている。
簡単に言うと、ここのcとはPowershellで言うところの$_の事で、パイプラインから流れこんでくるオブジェクトの1件を表す。Powershellの場合は$_と固定的な変数名となっているが、ラムダ式の場合は自分で好きな変数名を付与できる。
ここでは、たまたまcという変数名を指定している。


という理由でCustomersの行オブジェクトの1つがcという変数名で参照できるので、そのCountryプロパティが”USA”と等しい物という条件を指定している。


同じ指定を埋め込みクエリー方式で書くとこんな感じになる。


                //var selectCustomer = nwds.Customers.Where(c => c.Country == "USA");
var selectCustomer = from c in nwds.Customers
where c.Country == "USA"
select c;

埋め込みクエリー方式ではSelectが省略できないようだ。

◆LINQを試してみる環境を作る

サンプルDBとしてSQLServerではポピュラーなPubsとNorthWindsを使う。
基本的にLINQは参照がメインなので普通にアタッチ済みのDBにしたほうが良いようにも思うが、参考にしている書籍が動的にアタッチする方式で行っていたのでそれに習うことにした。

  1. データベースファイルの入手
    PubsとNorthWindsは適当に探せば見つかるはず。
    とりあえずSQLServer2000用のサンプルデータベースが以下からダウンロード出来る。
    Download details: Northwind and pubs Sample Databases for SQL Server 2000
  2. データベースファイルをプロジェクトに追加する
    プロジェクトにPubsとNorthWindsのフォルダを作成し、それぞれそこへMDFファイルをドロップする。
    データベースモデルの選択ダイアログが表示されるがとりあえずどちらも使わないのでキャンセル。
    するとフォルダにMDFファイルが追加される。
    20110403173328
  3. LINQ to SQL クラスを追加する
    DB構造を取り込んでLINQ用のサポートクラス(環境)をつくるために「LINQ to SQL」クラスを追加する。追加方法は、
     NorthWindsフォルダのコンテキストメニューから「追加」「新しい項目」をクリック。
     表示された新しい項目の追加ダイアログから「LINQ to SQL クラス」をクリック。
     名前欄に適当な名前(DBと同じ名前が妥当だろう)を付けてOK
     すると以下のようにdbmlファイルが追加される。
    20110403174149
  4. dbmlファイル(デザイナ)にテーブルを追加
    データベースエクスプローラ(Professionalとかはサーバーエクスプローラかな)からNorthWindsのテーブルを全て選択しデザイナ画面にドラッグ&ドロップ。
    すると以下のようにリレーション付きで各テーブルの内容が追加される。(このタイミングでそれぞれのテーブルに対するエンティティクラスやもろもろのクラスがコードビハインドにつくられるようだ)
    20110403174659 
    ちなみにこの画面(に限らず、VS2010の画面)はOfficeソフトなどと同様にCtrlキーを押しながらマウスを動かすと拡大縮小が可能だ。

以上で、とりあえずLINQを試す環境は出来上がり。

あとはコーディングしていくだけだ。

◆LinqとDataGridViewは仲が悪い?

最近MSのDBアクセス技術を勉強し始めている。
まぁ、勉強と言っても仕事で使うわけではないのであくまでも俯瞰するだけ。

ということで以下の書籍をもとにサラッと弄ってみようと軽い気持ちで始めたがいきなり躓く。

躓いたと言ってもこの書籍の中身ではなく(この書籍自体は通称赤間本なので非常に丁寧な説明で分かりやすくお薦めである)、サンプル結果を表示しようとLinqの結果をDataGridViewにバインドした場合である。

一般的にLINQの解説記事なり解説本はLINQの文法の説明になりがちで、LINQを使ってどう業務アプリケーションを組み立てるかという所には触れられていない。
なのでLINQでデータを取り出してコンソール出力して終わりというパターンで終わっている。
サンプルを試していくに当たり、都度コンソール出力するのは面倒だし結果も確認しづらいのでDataGridViewにバインドして確認することとした。

バインド自体は通常の手順で簡単にできるのだが、実際サンプルに載っていたNorthWindの表示で不可解なエラーに悩まされる。
サンプル自体は以下のようになんの変哲もない基本的なものである。

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
using (NorthWindDataContext nwnd = new NorthWindDataContext())
{
nwnd.Log = Console.Out;
var ordersdata = nwnd.Order.Where(o => o.OrderDate >= new DateTime(1996, 7, 1) &&
o.OrderDate <= new DateTime(1996, 8, 1))
;


BindingSource src = new BindingSource();
src.DataSource = ordersdata;
dataGridView1.DataSource = src;
}
}
}
}

20110403103255


実行すると結果もちゃんと表示されて一見なんの問題もなさそうだ。
しかし、なぜかこの画面を右にスクロールしていくと、
image



こんな例外が発生する。
発生箇所はLINQのデザイナー、
20110403104604 
の陰で自動生成されているコードビハインドソースの中だ。
「破棄されたオブジェクトにアクセス出来ません」?


なんのこっちゃ。
これだから、最近のMSの抽象度の高いお気軽プログラミングはみんなに嫌われてしまう。
ブラックボックスは、それがうまく動いている限りにおいては「魔法の杖」だが、ひとたびトラブルが発生するとアンタッチャブルな「悪魔の化身」になる。
そこで一度ブラックボックスで躓いた人はその後、その手に技術にトラウマができて忌み嫌うようになってしまう。
MS系の技術が嫌われ、みんなオープン系に流れてしまうのは、その中途半端なブラックボックスに原因があるのではなかろうか。
ブラックボックスは完璧であってこそその存在価値があるのだ。
私の周りでもVisualStudioで開発しているチームでさえ、データセットなどを使わず自前でエンティティ(DTO)をつくる傾向にある。


しかし、私的にはMSの目指している方向は正しいと思っている。
プログラミングなんてお気軽に越したことはない。あくまでも道具なのだから。
問題は品質なのだ。

20年ほど前、私の部署にOS製造部隊から異動してきた人がいた。(私の部署は一般の業務アプリケーション開発部署でCOBOLを使っていた)
その人は、COBOLアプリケーションをデバッグするのにいつもアセンブリーリストを追いかけていた。
そして普通のCOBOLプログラマーが見たら3分で気づきそうなバグを1週間もかけてデバッグしていた。
見かねた私は、「COBOLソースを見たほうが早いですよ」と声をかけたのだが、その人は「いや、COBOLのコンパイラーは当てにならんから」とにこやかに言い放った。
私は内心「当てにならないのは、コンパイラーより、そのCOBOLプログラムを書いたあなたの方ですから」と思ったものだ。


まぁこれは極端な例だが最近のMSさん、よく言えば柔軟で守備範囲が広いのだが悪く言うと色んな機能に手を出してそれぞれの技術の品質がおろそかなような気がする。RAD中心かと思えばASP.NET MVCを出してみたりPOCOをサポートしてみたり。
私はまだ使う気がないが、MSが強力に推進しているAzureも推して知るべしといった気がする。
昔に比べればずいぶん高機能で便利なはずなのに結果的に、それでシステムを作ると昔より時間がかかってしまう。
そんな技術ははっきり言って我々には迷惑この上ない。(技術系オタクには面白い世界なのだろうが)
私が最近期待しているLightSwitchにはぜひ完成度の高いブラックボックスとして登場してほしい。


だいぶ脇道にそれたが、本題に戻ってこのエラーを調べてみた。
といっても、そもそもこれからLINQを勉強しようというのだから本質的なところは判るはずもない。あくまでも現状認識と想像である。
ここで自分がアクセスしている(つもり)なのはOrdersテーブルである。
なのに、エラー箇所を見るとどうもPublisherテーブルにアクセスしに行っている箇所の様に見える。
これはどうしたことだろう。
LINQの売りの機能として、リンクが貼られたテーブルの項目をあたかも自分のオブジェクトのプロパティを参照する様にたぐれるというものがある。
実際に、上記でLinqの結果を格納しているOrderdata変数をみて見るとPublisherをプロパティで保持しているのが判る。
image


今回の例で言うと、この結果をそのままDataGridViewのデータソースに指定しているので意図しないPublisherまでデータ取得がされているのだろう。
ちなみに、発行されたSQLを見ると、自分で意図してPublisherの値をたぐった時はJoinが発行されているのだが、今回のようなケースでは単純に1件、1件取得するSQLが発行されているっぽい。


こういう時の為に、リレーションをたぐったプロパティを除いたオリジナル構造のクラスなんかも定義してくれるとか、DataGridViewでEntitySet型はバイパスしてくれるとか、なにか対応があっても良いような気もする。


何かしら対応策があるのかもしれないがなにぶんLINGを使い始めたばかりなのでこれ以上は後回し。
なんにしてもリレーションをたぐって追加されているプロパティが悪さをしているのは確かなので、それを除いてGridViewに表示してあげる。


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
using (NorthWindDataContext nwnd = new NorthWindDataContext())
{
nwnd.Log = Console.Out;
var ordersdata = nwnd.Order.Where(o => o.OrderDate >= new DateTime(1996, 7, 1) &&
o.OrderDate <= new DateTime(1996, 8, 1))
.Select(o => new
{
o.OrderID,
o.CustomerID,
o.EmployeeID,
o.OrderDate,
o.RequiredDate,
o.ShippedDate,
o.ShipVia,
o.Freight,
o.ShipName,
o.ShipAddress,
o.ShipCity,
o.ShipRegion,
o.ShipPostalCode,
o.ShipCountry
});

BindingSource src = new BindingSource();
src.DataSource = ordersdata;
dataGridView1.DataSource = src;
}
}
}
}

これでとりあえず落ちなくはなった。
実際の業務処理では全項目ということはなく必ずSelectが入るだろうからあまり実害はないのかもしれないが、サンプルなどではありがちなパターンなので面倒は面倒だ。


逆に、ここらへんの性質を活かした階層構造対応のGridコントロールなんかがあれば便利なのにと思ったりもする。(サードパーティでは昔からあるが)


なんにしても初めからやけに躓いて時間を浪費してしまった・・・・。

2011年3月31日木曜日

◆Pubsで悩む

MS系ではおなじみのPubsデータベースを見ていてくだらないことで一晩悩んでしまった。

image

Pubsデータベースの中のauthorsとtitlesテーブル、この図を見ると多対多の関係で中間テーブルにtitleauthorを追加している典型的なパターンに見える。

そこでふと疑問に思った。多対多?
ん~、タイトルが同名の本があるからか?
でもtitle_idが付いているんだからそんなことないよな・・・・。

業務要件的に追加された特別な中間テーブルか?
DB設計なんてまともにやったことがないのでちょっと不安になる。

翌日、一度真剣にDB設計の勉強をしてみるかなんて考えながらAmazonで本を眺めていて、はたと気がついた。

あぁー、共著かぁ・・・。

◆スタートアップで悪さするプログラムの特定方法(メモ)

Windows Vista または Windows 7 でクリーン ブートを実行して問題のトラブルシューティングを行う方法

◆Windows7 SP1がインストール出来ない場合(メモ)

[Win7] <KB976932 / sp1> ウィンドウズ - Microsoft Answers

システム更新準備ツールというのをインストールするとうまくいくケースが有るらしい。

2011年3月29日火曜日

◆NorthWindサンプルデータベースのインストール(メモ)

osql -E -S ComputerName/InstanceName -i instnwnd.sql

◆スリープ(Sleep)設定の勧め

関東、東北での厳しい電力状況を鑑みて日本全体での節電が求められてる。

そこでWindows7におけるSleep設定をメモしておく。

「コントロールパネル」「電源オプション」を開く。
image
「プラン設定の変更」をクリック。

image
自分のパソコン使用状況に応じて「ディスプレイの電源を切る」時間と「コンピュータをスリープ状態にする」時間を設定する。

「詳細な電源設定の変更」をクリックして、
image
「復帰時のパスワードを必要とする」を「いいえ」にしておいたほうが、こまめにスリープさせる際は便利。

手動でスリープさせるときは、「Win → → S」とタイプすれば良い。(当然マウスでクリックしてもよいが。

一発でスリープしたいときは、デスクトップで右クリックして「新規作成」から「ショートカット」を選ぶ。
image

「項目の場所を指定してください」のボックスへ以下のコマンドを入力して「次へ」進みOK。
rundll32 PowrProf.dll,SetSuspendState

デスクトップにできたショートカットを右クリックして「プロパティ」を選択。
image

中程にある「ショートカットキー」のボックスをクリックして好きなショートカットキーを入力する。(Ctrl + Alt は自動的に付加される)

ちなみに復帰させる方法は繋がっているデバイス(マウスやキーボード)によって変わってくる。
例えば、スリープ復帰に対応しているマウスの場合は、「コントロールパネル」「デバイスマネージャ」でマウスのプロパティを開くと、
image
image

「電源の管理」というタブがあり、スリープ解除させるかどうかの設定が可能。
感度の良いマウスは、ちょっとした動きを感知して復帰してしまうので、その場合はこのチェックを外しておくと良いだろう。

解除できるデバイスが何もつながっていない時は電源ボタンになるのかな?

私のPCの場合は、スリープに入るのはほとんどノータイム、復帰が3秒程度だった。

ーー

予想通り?若干の不具合が発生。
マウスにアサインしたコマンドが効かなくなる。
とりあえず以下で対処した。
PowerShell: ◆スリープ(Sleep)解除イベントを拾う

2011年3月25日金曜日

◆TableAdapterManager

VisualStudio2008から?TableAdapterManagerなるコンポーネントが追加されて、それまで個々のテーブルアダプタ毎に更新する必要があった処理をUpdateAll()で一発実行出来るようになった。

なおかつ凄いことに、テーブル間の制約も理解して更新順序を良きに計らってくれるらしい。

う~ん、素晴らしい。
私のお手軽プログラミングスタイルにぴったりの機能だ。

早速NorthWindの「Orders」と「Order Detail」でマスター詳細パターンの更新を行ってみた。

っが、新規追加がエラーになる。
外部キー制約の例外だそうだ。

どうやら、「Orders」テーブルのOrderIDはIdentity列(AutoNumber自動付番)に成っているのだが、そこで付番された番号を「Order Detail」のOrderIDに読みなおしてInsertするという機能がバグっているっぽい。

試しに個々のTableadapterのUpdateメソッドを順に(当然Ordersから)実行するとうまくいく。

TableAdapterManagerは比較的シンプルなオブジェクトで特別な設定もなさげ。

調べていくと以下のようなバグ報告を見つけた。
Hierarchial update of Master/Child with autoincrement (identity) primary key on Master - not possible | Microsoft Connect

2008のころからバグってるの?

NorthWindにあるような標準的なパターンで動かないんじゃ使い物にならないじゃん(><)

◆VisualStudio2010 「出力ディレクトリーにコピー」

プロジェクトにデータベースファイル(MDF)を追加していると、そのプロパティに「出力ディレクトリーにコピー」というのが現れる。

これは、実行時にプロジェクトにあるMDFファイルをBinディレクトリーにコピーした上でSQLServerにアタッチして使う方式である。
プログラムで色々とテスト的にデータを弄っても、次にはきれいなDBの状態から再度テストが出来るという機能だ。

最初にこの機能が出来たとき、更新したはずなのに次に見ると更新されていな~い???
っと戸惑う元にもなった。

2010では(いつからかは知らないが)若干動きが変わっているようだ。
「常にコピーする」の設定でも、再実行すると前回の更新内容が反映されている。
あれ、コピーされるはずじゃないの?っと思っているといつの間にか元に戻っていたりする。

どうやら、ソースを変更した時はコピーし直されるような感じだ。

判っていれば、それはそれで便利だが気づかないと混乱するかもしれない。

2011年3月23日水曜日

◆Windows Live Writer で SyntaxHighlighterプラグインを使ってBloggerに投稿する

Syntax Highlighter自体はプラグインの追加から簡単にできる。
しかし、それだけでは色付けはされずブログサイトの方にも設定が必要なようだ。

私はWEB系に疎いので自前でごねごねするのは勘弁ね。
って事で探していたところ以下のサイトで簡単な方法を見つけた。
yan note: BloggerでSyntaxHighliterを使うには?

FaziBear: Blogger Syntax Highlighterにアクセスし「this」のリンクをクリック。
image

以下の画面が表示されるので「Add To Blogger」をクリックすると、
image

こんなふうに怒られた。
image

設定を変えてセキュリティを弱めれば実行出来るのかもしれないが、調べるのが面倒なのでFireFoxで試してみたところ、上手く行った。

画面にウィジェットが追加され、以下の表示が意味もなく入ってしまうが、一番下に持って行ってとりあえず良とした。
image

以下はC#のソースを表示した例である。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace PubsDetail
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void authorsBindingNavigatorSaveItem_Click(object sender, EventArgs e)
{
this.Validate();
this.authorsBindingSource.EndEdit();
this.tableAdapterManager.UpdateAll(this.pUBSDataSet);

}

private void Form1_Load(object sender, EventArgs e)
{
// TODO: このコード行はデータを 'pUBSDataSet.authors' テーブルに読み込みます。必要に応じて移動、または削除をしてください。
this.authorsTableAdapter.Fill(this.pUBSDataSet.authors);

}

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
switch (e.KeyCode)
{
case Keys.PageUp:
this.authorsBindingSource.MovePrevious();
break;
case Keys.PageDown:
this.authorsBindingSource.MoveNext();
break;
}
}
}
}

出来れば横スクロールが欲しい気がするが・・・。

◆VisualStudio2010 Expressで扱えるデータソース

最近久しぶり(5年ぶり位?)にプログラミングというかDBアプリの勉強をしている。
動機としてはMSのLightSwitchという開発ツールに興味を持ったから。
もはや仕事で本格的なアプリケーションを作るようなことは無いので、昔使ったAccessのようにお手軽にちょっとしたWEBアプリが作れたら良いのになぁ、と思っていたところだったので・・・。

ベータ版を触ってみたところ簡単は簡単そう。
でも、やるからにはある程度仕組みも理解しておきたい。
VisualStudioでのDBアプリとなるとほとんど素のADO.NETを使った経験しかないのだが、最近ではLinqやらEntityFrameworkやらの新しい技術が次々と投入されている。(というか自分が全然触っていなだけなのだが)
ASP.NETも出た時にちょっと触ったきり今となっては忘却の彼方。
IISの設定とかSQLServerの設定とかもさっぱり。

あくまでもホビープログラミングなのでスペシャリストになる気はないが、お手軽開発する為に必要な知識は全体的に俯瞰しておきたい。

という事でネット記事を参考にSQLServerアプリを(まずはWindowsフォームアプリ)を弄ってみる。

ネット記事がVisualStudioのExpress版を使っていたので自分もExpress版(バージョンは違うが)で試していたのだが、Expressってアタッチされた普通のDBって扱えないのね・・・。(正確にはGUIサポートが無い)
データソースを作る以下の画面で一生懸命DBに繋ごうとしていた。
image

この画面で「SQLServerデータベースファイル」を選択すると次の画面でファイル選択ダイアログが出てきてしまうのでMDFファイルを直接指定するしかなくなってしまう。
仕方がないのでアタッチしているMDFを指定してVisualStudioから更新を掛けたらSSMSから繋がらなくなってしまった。(軽~くDBが壊れたふう)
そこでPremiumエディションの方を見てみると、
image

なんだ、ちゃんと用意されてるじゃん。

余計なところで躓いた(><)

 

最近思うのだが、こういった開発向けの書籍がめっきり減った。進化の早い世界なのでネットに押されて書籍は売れないんだろうな。
ただ、ネットの情報も纏まった中身の濃い情報というのは非常に少なく、自分で寄せ集める必要があり若干ストレスが溜まる。
有料でも良いからネットで纏まった情報が発信されて欲しいものだ。

日本MS社員なんかがもっと頑張ってくれると助かるのにな。

--追記

ちなみに、VisualWebDeveloperはデータベースファイル以外も扱えるようだ。(混乱するので統一してほしいなぁ)

2011年2月25日金曜日

◆Windows7のFontsフォルダーに一般ユーザーアクセス権を付与する

ユーザーに外字を作らせたりすることはあるので、この設定は必要だなぁ。

Fonts Folder Permission - Windows 7 Forums

私が最近チェックした記事