Silverlight 上でStringFormat 等のカルチャ指定

例えばこんなの。

<TextBlock x:Name="txtUpdatedDate" HorizontalAlignment="Left" Margin="0,24,0,0" Text="{Binding Mode=OneWay, Path=updatedDate, StringFormat=¥{0:f¥}}" />

コレを出力すると
Suturday, July 09, 2011 3:00 PM
なんて出力されて萎えてしまう訳で。

じゃぁどうするかっていうと、
・コンバーターを自作する
→あるべき姿かも知れないけど、ちょっと大がかりじゃね?

と言う訳で調べてみたら、こんなテがありました。

画面のコンストラクタで

this.Language = XmlLanguage.GetLanguage(Thread.CurrentThread.CurrentCulture.Name);

とする。(要:System.Markup と System.Threading の using指定)

各画面毎にやるとすると面倒くさい気もしますが、まぁこんな手もありますってことで。

Silverlight Tooklit を使って折れ線グラフを出す方法のメモ

Silverlight 4 での開発環境と Tooklit  (2010/4版)の準備は終わっている前提で。

1.表示するデータを用意する。
表示するデータを保持するクラスとそのListを用意。
ここでは、time (x軸), planned (y1軸), result (y2軸) のプロパティを持つクラスと、そのリストを用意。

2. 表示領域を用意する。
Toolkit:Chat を表示領域に貼り付ける。大きさとか色はお好み。

3. グラフのタイトルと軸の作成
グラフタイトルは 貼り付けた Chart の Title プロパティ。
軸は  LinearAxis で、方向は Orientation プロパティで決める。
X軸とY軸なので、LinearAxis は二つは必要と言うことに。
作った LiearAxis を Chart.Axes に Add する。
最大値・最小値の設定が必要なら、 Minimum・Maximum プロパティで設定。

4. 線を用意する
線は LineSeries で。
Title プロパティで凡例に出す文字列を設定。

ItemSource プロパティに先ほどの1.で用意したリストを設定。 ItemSource は IEnumerable を受け取る、
IndependentValueBinding プロパティに、X軸方向に使用する項目の Binding を設定。こんな感じ。

serPlanned.IndependentValueBinding = new Binding("time");

DependentValueBinding も同様に、Y軸方向に使用する項目の Binding を設定。

同じく、作った LineSeries をChart.Series に Add する。

こうすると、取り敢えずグラフは出ます。

注意点としては、自分でグルグルとリストを回して、ポイントを作っていこうとは考えない方が良いと言うこと。Bind して全てを委ねた方がカンタンという話。

SQL Error 16958

 16958 (重大度レベル16)  カーソルが宣言された後に、設定オプションが変更されたので、カーソル操作を完了できませんでした。

いや、カーソル内でそんなことしてないし、何の事だ?と思ったのですが、調べて行き着いたのがコチラ http://social.msdn.microsoft.com/Forums/en-SG/transactsql/thread/c798785f-2bf0-4fe5-b137-e6353f5138ec

呼ばれ先のSPの中で SET でなんかいじってないか?って。QUOTED_IDENTIFIERとか…

で、その問題の子SPを見てみたら、シッカリ一行目にそういうモノがありました。

このメッセージが出た時は、この辺りを疑ってみるのも良いでしょう。

#しかし、相変わらず、SQL Server のエラーメッセージってやつは…

SQL Server のビルド番号

一応Enterprise Manager の右下隅とかに出る訳ですが、製品名とSPです。
まぁ、たいていの場合にはそれで事が足ります。

が、もっと細かい情報が必要になる時とかは、

select @@version

とか

select SERVERPROPERTY(‘productversion’)

とかでビルド番号を調べるとかする訳です。が、ビルド番号が解っても、出てきた結果が結構訳がわからない。9.00.5000 とか、8.00.2282 とかなんじゃそりゃ?という訳で。

そういう時にはコチラ Microsoft SQL Server 2011, 2008R2, 2008, 2005, 2000 and 7.0 Builds( http://sqlserverbuilds.blogspot.com/ ) に一覧表がまとまっています。

SP ばかりではなく、各種パッチ類、CTP 、オマケに製品のコードネームまでつけるイキオイで、ちょいとお役立ち。

VBサンプルコード まとめページ

 まぁVBのサンプルコードの類は、普通にMSDNとか、然るべき定番サイトとか行けば色々とあるのですが。
コチラはMicrosoft VBチーム謹製のサンプルコードまとめ。
リンク先が更にまとめサイトになっていたりもします。

リンク先はコチラ
http://blogs.msdn.com/b/vbteam/archive/2011/01/10/visual-basic-code-examples.aspx

ただ、カテゴリーのアイコンをクリックすると、そのアイコンのページ(つまり画像自体)が表示されるのがなんとも…

SQLiteのテーブル構造を取得するには

データセットとか使ってればそんな必要もないでしょうが、コード内からテーブル構造を取得して云々するコトもあるわけです。

SQL Server なら sp_columns  を呼べばいいわけですが、SQLiteでは?
cmd.exe 呼び出して .schema 叩いて出力をリダイレクトさせて…
なんて力業に出る必要はありませんでした。

System.Data.SQLite にきちんとその道が用意されています。
こんな感じで取得します。

Dim strConnectionString As String = "data source = " & strSQLiteFileName

Using cnSQLite As New SQLiteConnection(strConnectionString)
     cnSQLite.Open()
     '---スキーマ情報を取得する
     Dim objSchemaInfo As DataTable
     Dim strTableInfo() As String = {Nothing, Nothing, "テーブル名", Nothing}
     objSchemaInfo = cnSQLite.GetSchema("Columns", strTableInfo)

     '---取得したスキーマ情報を格納する
     For Each objRow As DataRow In objSchemaInfo.Rows
          Console.Writeline(objRow!COLUMN_NAME.ToString)
     Next

     cnSQLite.Close()
End Using

小さな嵌り所としては、”COLUMN_NAME”を取ってくるのに”!”を使うところ。
“.” ではないところが要注意です。

System.Data.SQLite で、日付型のラウンドトリップに失敗することがある

 SQLite の特徴の一つに「弱い型付け」があります。
それゆえ、PHPとか Ruby とかと相性がよいわけです。

が、それゆえに、.NET 系の「強い型付け」な言語と相性が悪かったりします。

先日遭遇したのは、こんな事例。

SQLiteに日付型のデータを入れて、取ってくるところでExceptionになる。
一言で言うと「ラウンドトリップできない」と。

ラウンドトリップ失敗の例

つまり、パラメータクエリで日付を渡すと、取得時に落ちるわけです。

原因は、” Now.ToString() “でした。
つまり、 DateTime.ToString を引数なしで呼び出すと、「地域と言語の指定」に従った「短い形式」で文字列にするわけです。日本の場合、一般的には “yyyy/mm/dd” 形式。

ですが、SQLite では “yyyy-mm-dd”形式 – 要するに、 ISO 8601 形式 (“T”は無くても良い)を日付として認識し、”yyyy/mm/dd”は日付として認識してくれない用なのです。

ためしに、コンソールでこんな風にやってみると…

sqlite> select datetime(’2010-01-20′);
2010-01-20 00:00:00
sqlite> select datetime(’2010/01/20′);

sqlite>

スラッシュ区切りは日付にあらずと言うわけです。が、そこは弱い型付けの SQLite、しっかりInsertは成功してるんですね。さらに、コンソールでのSelectも成功。 System.Data.SQLite で変換失敗というわけです。

解決策は意外と簡単で、
1)パラメータ渡すのにいちいち ToString しないで DateTime で渡す
2)どうしても ToString したかったら、 ToString(“s”) を使う。
3)DataSet を使う

データセットを使ってみた例

相手が SQL Server とか Oracle とかなら、そもそもコンパイルか Insert 時にエラーになりそうですが、 SQLite の場合にはこうなりますってことで。

SQLite の日付はUTC

 SQLite って何ってのは、とりあえずググって下さい。 本家はコチラ www.sqlite.org 。

どうやって落とすか、インストールするか、使うかってのも、色々リソースがあるので省略。
どうやってDataSetをデザインタイムでいじるのかってのも、コチラ http://sqlite.phxsoftware.com/ から。
で、本題。SQLite での日付型は、UTCで管理されるというオハナシ。
たとえば
CREATE TABLE test2(id int, name text, UpdateDate datetime);
なんてのがあって、
insert into test2 values(1,’Tokyo’,datetime(‘now’));
なんてカマして安心していると、中に入っているのはUTCというコトです。

安心しきってると、日付データがもれなく9時間ずれます。プログラム内で現在時刻と比較したり、SQL Server とかと比較したりすると、軽めに死ねそうです。

で、どうするか。

1) SQLを工夫する
select datetime(UpdateDate,’localtime’) from test2;
とすると、ローカルタイムに変換してくれます。
データセットデザイナでやると、型推論がうまくいかないのか、Object型になっちゃうのが難点。

2) DataSet でなんとかする
DataSet – DataTable の当該行を選択してプロパティ→DateTimeMode を”Utc”に変更。
そうすると、DateTime の Kind プロパティが “Utc”になるので、ToLocalTime してOK。

3) コード内でアレコレ
DBから取ってきてそのまま突っ込んでも、”Kind”プロパティが”Unspecified”のママです。ようするに、「時刻がUTCか地方時なのか知らないけど、とにかく入ってるよ。」状態ってことです。
まぁ、確かに日本は夏時間もないのでそのまま9時間加算してあげれば良いような気もします。ただ何となく個人的にどうにも居心地が悪いのです。
やるとすれば、こんな感じかなと…

‘—-まずはDBから取ってきた生の状態が DateTime の中身。
Dim dteResult As DateTime = CDate(objCommand.ExecuteScalar())
‘—-これをUTC時刻として(つまりオフセット0で) DateTimeOffset に入れる。
Dim dtoLocal As New DateTimeOffset(dteResult, New TimeSpan(0))
‘—-ここで、地方時を呼び出す
Console.WriteLine(dtoLocal.LocalDateTime)
‘—-これできちんと地方時に変換されました。


ま、どの方法がどうこうもあるけど、知っとかないと痛手くらいそうな場所なのでメモ。

自家製ObjectをTreeView等に突っ込む時の注意点

軽めに嵌りそうになったのでメモ
MSDN-Windows Presentation Foundation データ テンプレートの概要
つまり、TreeViewとかListBoxとかが表示する時にはデフォでToStringを使うってこと。
ここで軽めに嵌ったのは、
○:Public Overrides
×:Public Overloads
×:Friend Overloads
コンパイルエラー:Friend Overrides
というポイント。むやみやたらとスコープを狭くするクセのある人は注意。