読者です 読者をやめる 読者になる 読者になる

高見知英のかいはつにっし(β)

高見知英のアプリケーション開発日誌 のほか、地域活動などの活動報告ブログ。

SQL Server 2005 Compact Edition で時刻をINSERT

プログラミング

現在、Windows Mobile用の家計簿ソフトを作成中です。TDiaryは一時お休み中。というのも、出来れば引っ越しまでに間に合わせたいので。とりあえず使用可能なレベルにまで達しているTDiaryの方はもう急がなくてもとりあえず大丈夫かなと(^^ゞ
それはそれとして、家計簿の記録には、Ad[es]より標準搭載となった、SQL Server 2005 Compact Editionを使用しています。関数など見てみた限りかなり貧弱で、本当に出来ることは少ない(日付型のデフォルト値を指定しようとして、NOW関数がないのにはちょっとびっくりしました(^_^;MySQLだったか日付欄に安易にNOWを多用していたので)ですが、何かの計算や集計には十分使えるレベルです。
さて、SQLを使う骨組み部分を作成してちょっと気になったのが、日付型(SQL型のdatetime)をINSERTするにはどうすればいいのかということ。今まで何も考えずにDateTime型のToStringの値を送っていましたが、今日テストしてみて年月日の年と日の値が逆になっていることに気がつきました(今日ならば、2004/09/07 というように)。
で、しばらくリファレンスとにらめっこしていると、どうも日付の表記方法に問題があるらしい。
というのも、短い日付表記だと「07/09/04」というようにすべて二桁になってしまうため、「dd/MM/yy」としてこれを読み込んでしまうらしいです。なのでToString("yyyy/MM/dd hh:mm:ss")という風に、年を4桁で表記してやればOK。SELECT文で得たdatetime型はDateTime型にすんなりキャスト可能。なかなか便利です。
あと、ほかに使ってみていた中でとまどったものとして、SQLのmoney型は.NETのdecimal型にキャストできること。ncharなどの桁数固定の文字列は、桁数分の空白でパディングされていることくらいでしょうか。
まとめると以下のような感じ。

SqlCeDataReader reader = cmd.ExecuteReader();
while(reader.Read())
{
  DateTime dateTime = (DateTime)reader["datetime"];
  string nchar = ((string)reader["nchar"]).TrimEnd();
  decimal money = (decimal)reader["money"];
}

割と.NETと親和性の高いSQL処理系ですね、割とお手軽に使える良い環境かもしれません。今バージョンからPCWindowsでも使えることですしね。


そうそう、上で書いているリファレンスは、下記のページよりダウンロード出来るSQL Server 2005 Compact Edition Books Onlineを参照のこと。