2011年02月27日

カプレカ数

   このエントリーをはてなブックマークに追加 Clip to Evernote
Gushwell's C# Programming Pageの「C#プログラム小品集」に、「カプレカ数」を求めるプログラムを掲載しました。

カプレカ数とは、

2乗した値を前の部分と後ろの部分に分けて、その和を取ったとき、元の値に等しくなる数

のことです。

  

Posted by gushwell at 21:25Comments(6)TrackBack(1)

2011年02月23日

MSDNライブラリの「ライトウェイト」ページが便利

   このエントリーをはてなブックマークに追加 Clip to Evernote
MSDNライブラリのページですが、僕は表示が早い「ライトウェイト」に設定して利用しています。
このライトウェイトで表示されるページで、最近気が付いたのですが、
マウスカーソルを、テキストの上に移動すると、その原文がポップアップで表示されるんですね。

これは便利です。ラジオボタンで訳文と原文を切り替えられるのも良いですね。

MSDNLib
  
Posted by gushwell at 21:22Comments(0)TrackBack(0)

2011年02月20日

Silverlight4でドラッグ&ドロップ

   このエントリーをはてなブックマークに追加 Clip to Evernote
Silverlight4では、ドラッグ&ドロップができるようになったので、
ここ「Drag and Drop Files in Silverlight 4」を参考に、テストプログラムを作成し、
デバッグ実行したのですが、エクスプローラからのファイルのドラッグ&ドロップができません。
ファイルをドロップしようとしても、マウスカーソルの形状が禁止マークになっています。

いくらプログラムを見直してみても、おかしそうな箇所はありません。
IEの設定も、ちゃんとドラッグ&ドロップを有効にしてあるし...

ためしに、IE以外のブラウザ(Chrome, firefoxなど)を起動し、アドレスをコピーして、
作成したプログラムを動かしてみると、今度はドラッグ&ドロップができます。

理由がわからず、かなり悩みました。
原因は、Visual Studio 2010を管理者権限で起動していたためでした。

そういえば、以前も同じ問題で悩んだことがあったっけ。
成長してませんね。

ところで、Visual Studio を 管理者権限にしなければいけない理由ってなんだったんだっけ?
思い出せないので、管理者権限で起動するのをやめてみることにしました。

ちなみに、Silverlight4でエクスプローラからのDrag&Dropを可能にするには、
コントロールの AllowDrop を "True" にし、
Dropイベントハンドラで、次のようなコードを書くだけです。


  
Posted by gushwell at 21:30Comments(0)TrackBack(0)

2011年02月16日

Silverlightでドラゴン曲線

   このエントリーをはてなブックマークに追加 Clip to Evernote
Webサイト - Gushwell's C# Programming Pageの「C#プログラム小品集」にドラゴン曲線の記事をアップしました。
DragonCurve
実際にブラウザで動くSilverlightプログラムは、こちらをどうぞ。C#のコードも公開しています。   
Posted by gushwell at 22:41Comments(0)TrackBack(0)

2011年02月13日

2011年02月10日

LINQ to SQL番外編 - 競合時の処理

   このエントリーをはてなブックマークに追加 Clip to Evernote
LINQ to SQLでは、ChangeConflictException の例外が発生した場合、その競合解決に、
DataContext.ChangeConflictsコレクションのResolveAllメソッドが利用できます。

そのコード例を示します。


ResolveAllメソッドの引数の型であるRefreshModeには、
 KeepChanges、KeepCurrentValues、OverwriteCurrentValues
の3つの値があり、この値によりどのように競合を解決するのかを指定します。

KeepChanges
変更された値と変更前(他のユーザによって変更された)値をマージします。
両方で変更されていた場合は、当該クライアントの変更を優先します。

KeepCurrentValues
他のユーザによって変更された値は無視され、当該クライアントからの変更が有効になります。

OverwriteCurrentValues
当該クライアントによって変更された値は無視され、他ユーザによって変更された値が有効になります。

これを表で表すと以下のようになります。
  カラムA カラムB カラムC
1.User1,USer2が読み込んだ値 aaa bbb ccc
2.User1が更新 sss ttt  
3.User2が更新 xxx   yyy
結果:KeepChanges xxx ttt yyy
結果:KeepCurrentValues xxx bbb yyy
結果:OverwriteCurrentValues sss ttt ccc

※ユーザ2で競合が発生し、ChangeConflicts.ResolveAllで競合解決を図った場合の例

競合の詳細な情報を取得したい場合は、DataContext.ChangeConflictsプロパティを参照します。
以下にそのサンプルコードを示します。



『LINQ to SQL番外編』は、今回を持って終了です。   
Posted by gushwell at 22:26Comments(0)TrackBack(0)

2011年02月06日

LINQ to SQL番外編 - 同時実行例外をいつスローさせるのか

   このエントリーをはてなブックマークに追加 Clip to Evernote
LINQ to SQLでは、楽観的同時実行制御の仕組みが組み込まれています。

たとえば、Customersテーブルの行のContactNameカラムをSubmitChangesメソッドで更新する場合、
LINQ to SQLは以下のような UPDATE文を発行します。


パラメータ p0, p1, p2... には、変更前の値が渡されます。
LINQ to SQL では、これによって他のユーザによって変更されていない場合にだけ、
このUPDATE文が成功することになります。
失敗した場合は、System.Data.Linq.ChangeConflictException例外が発生しますので、
他のユーザによる変更を把握できることになります。

SubmitChangesメソッドには引数を持つメソッドがオーバーロードされていて、
この例外が発生するタイミングを以下の2種類から指定できます。

1. 最初の失敗のときにのみ、例外をスローする

2. 失敗したすべての更新についての情報を収集してから、例外をスローする。

具体的な例外発生時の処理を指定したコードを示します。

競合発生した場合、どのような対応ができるのかは、次回説明します。


LINQ to SQL番外編とは
メールマガジン『C#プログラミングレッスン』で連載した「LINQ to SQL編」には書ききれなかった情報を
「番外編」としてブログにアップしています。
併せて、メールマガジン『C#プログラミングレッスン - Linq to SQL編』も読んでいただけると、
より理解が深まると思います。
バックナンバーは、メールマガジン『C#プログラミングレッスン』書庫のページからダウンロードできます。

  
Posted by gushwell at 22:33Comments(0)TrackBack(0)

2011年02月03日

LINQ to SQL番外編 - SelectWithUpdlock メソッドを自作

   このエントリーをはてなブックマークに追加 Clip to Evernote
LINQ to SQLでは、UPDLOCK付きの SQL文を発行させることができません。
以下のように書ければ良いのですが...
このような場合は、しかたないので、ExecuteQueryを使います。
これで、UPDLOCK付きのSELECT文を発行できます。

ただ、こういったSQLは、ストアドプロシージャを使う方が良いかな、と個人的には思います。
このあたり、LINQ to SQLの経験豊富な方の意見を聞いてみたいものです。

しかし、いちいちSQL文を手書きするのはイヤですよね。
ちょっと工夫してみましょう。

こんなメソッドを作ってみました。
このメソッドを使うコードは、こんな感じです。
※ 拡張メソッドにすれば、もっと使いやすくなりますね。

SelectWithUpdlockが、何をやっているかというと、
で、queryの実際のSQL文を文字列として取り出しています。
次に、
で、SQL文の FORM句の後ろに、"WITH (UPDLOCK)" という文字列を追加した、SQL文を作ります。
3行目の
ですが、Parametersに入っているパラメータの値を、配列に変換しています。
まず、Castメソッドを使って、Parametersを IEnumerable
変換し、クエリ演算子が利用できるようにします。そして、Select(p => p.Value)で、
パラメータのシーケンスを取り出し、ToArray()で配列にします。

最後に

で、クエリを発行し、結果を戻しています。

このSelectWithUpdlockメソッドですが、すべてのクエリ式で試したわけではない
ですが、それなりに動いているみたいです。
かなり、強引な方法ですが、これを応用すれば、LINQ to SQLが対応していないSQL文の実行も、
わざわざSQL文を書かなくても、LINQ to SQL上で実行することが可能になる?かもしれません。

  
Posted by gushwell at 23:00Comments(0)TrackBack(0)