中央競馬の予想や購入したもののメモなどを書いて行こうかと。まあ、個人的なメモ的なブログです。
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
前々から文字列として提供されたデータを数値化する際にエラーになるものがあり、対処はしてきたつもりでしたが、日付データとしてタイトル通りの"0000/00/00"は確かに存在しない日付としてエラーになる。日付データとして提供してるんなら、何らかの意味のある日付にして欲しい所ですが、具体的な日付が無い場合の対処として、プログラム組んでいると、最小値とか最大値にしたり、逃げ方は色々あるかとは思いますが、今回のこのゼロのオンパレードも考え方としては有かもしれませんが、マイクロソフトのDateTime.ParseではNGです。で、このエラートラップが必要になりました。
他の型の文字列→数値にはそれなりに関数作ってエラートラップしたものにしてましたが、日付型も新たに作り対応する事にしました。DateTime.MinValueがエラー時には適用される様にしてみました。
ってな訳で、フルセットアップを中断して再スタートしたので、明日の朝8時過ぎに終わるのかな~っと。これ、前回のフルセットアップでも見掛けたエラーだったんですが、諸々やってたら出なくてスルーしてたので、まあ、怪我の功名的な感じかも^^;
昨年末から続く身体的な問題。2週間程前にやっと退院したと思ったんですが、先週末に仕事中に腹部にまた異変があり、週明け月曜日に病院に行くと、昨年末の右鼠径ヘルニアよりも若干下になる右大腿ヘルニアとの診断で、水曜日に再手術となり、まあ、本日無事に退院して来ました^^;
入院前から始めていた新たな機能の処理などを巡り、データベース設計時点で不要かと思われた項目が必要だと判断しました。これ、大規模な開発とかで、データベース設計への変更が有った場合、単にエンティティの修正してUpdate-Databaseすれば、データベース自体には、今回の場合だと項目の追加になったので、それが反映されるのかな?ちと軽い気持ちで試す気になれなく、まあ、仮にデータベースに項目が追加されたとしても、その追加された項目だけを反映させるコーディングもしなきゃと思うと無駄に思えたので、60ギガバイトのDBファイルを潔く削除してデータのフルセットアップを開始しました。14、5時間なので明日の朝方には終わっている筈かな。
今後の開発進めていくのにも、今回の様な根本的な変更が無いとも言えないけど、まあ、無い様に進める方向で考える様にしなきゃとは思う。提供元からのデータ保存用のDBなので、アプリ側での個別データは別のデータベースを使う方向にすれば問題ないかな~っと安易に開発進めるんだけど、数人で行うプロジェクトとかではそうは行かないとは思うけど、自分一人でやってる事だから頭の中で上手く整理しながらやろうかと^^
C#だろうとVBだろうと、まあ、そもそもSQLは素人レベルだけど、なんとなくだけど、ここまで40年以上プログラミングしてたりすると、ある程度予測が出来たりしてイメージして、それをLINQ的に書いてみたりしてるんですが、LINQにはクエリ式とメソッド式があるんだと。で、最初はクエリ式で
var races = from i in db.RaceInfo
orderby i.year descending, i.month descending, i.day descending
select i;
って感じで書いてたんですが、メソッド式で
var races = db.RaceInfo
.OrderByDescending(i => i.year)
.OrderByDescending(i => i.month)
.OrderByDescending(i => i.day)
.ToArray();
にしてみたんですが、上手くソートされない。よくよく調べると、
var races = db.RaceInfo
.OrderByDescending(i => i.year)
.ThenByDescending(i => i.month)
.ThenByDescending(i => i.day)
.ToArray();
としなければならない事が分かった。LINQには更にLINQ to EntitiesとLINQ to Objectがあるんだと。で、更に今回の用途では読込のみで更新なんかはしないので
var races = db.RaceInfo
.OrderByDescending(i => i.year)
.ThenByDescending(i => i.month)
.ThenByDescending(i => i.day)
.AsNoTracking()
.ToArray();
としてやると、かなりスピードアップしました。これするには、今回のプロジェクトではusing Microsoft.EntityFrameworkCore;の追加が必要でした。自分の使っているEntityFrameworkの参照を有効にする必要があるって事の様です。
今週月曜日に人生初の大腸カメラの予約をしてたんですが、病院の指示通りに前日日曜日には3食指定の食事をし、下剤を服用して就寝し、決められた時間に病院の指定場所に入り、2時間掛けてニフレック2リットルを飲みきってまあ、実際には空腹でハイペースで飲んでしまい1時間半程度でしたが^^; 腸内のモノを出し切り、順番待ち。思いの外待たされ、ようやく自分の番が回ってきて検査が始まり眠りにつく。
で、検査終了で起こされ、「大きなのと小さなポリープが有ったので取りました。1週間程入院になります。」と、突然の宣告orz 会社にその旨連絡し、迎えに来る予定の妻には入院になったのでスマホの充電器だけはお願いした。火曜日夜までは点滴のみの寂しい入院生活。先月に続く入院だし、節約しやきゃだが大部屋の空きが無く個室に。初日は8,000円と案内されるが翌朝ここは12,000円の部屋だけど案内ミスなので8,000円でいいですって今度は本当の8,000円の個室に。違いはトイレにシャワーがついているか否かでした。3日目水曜日には大部屋っといっても、前回入院時は4人部屋でしたが2人部屋。ここまでの個室で夜間も夜な夜なゲームしたり、テレビもスマホで"どこでもディーガ"アプリで音出して視聴したりとなかなか有意義に過ごせただけに移動に躊躇したけど、節約は必要なので我慢。しかも、水曜日午後には1週間程度と言われてたのに、担当医師が来て「明日退院する?」って言われ、逆に「大丈夫ですか?」と確認すると「まあ、心配だったら明後日金曜日に退院にしようか」って事で本日無事に退院して来ました。67,620円となりました。この内、16,000円は個室代なので本来5万円程度だった様です。
で、本題ですが、入院少し前に気が付いたんですが、Preview版から正規のVisual Studio 2022 Version 17.0.5にしてからだと思うんですが、C#のバージョンが10になっているのに気が付き、実はマイクロソフトのラウンチイベ以降に諸々知った情報でPreviewの段階でも試してたんですが、結果的にはNG(コンパイルエラー)だったんですが、C#お決まりの、namespace xxx {}の括りが、先頭にnamespace xxx;で済み、インデントが1つ減らせる的なのを再度試しました。
Previewでこの言語バージョンがどうだったか今更確認は出来ませんが、仕様通りにコンパイルも通りインデントを1段減らす事が出来ました。
データベース登録処理はほぼデバッグ完了。巨大なDBファイル抱えたプロジェクトはバックアップも大変orz バックアップする場所も以前は無料クラウドに可能だったけど、このサイズは辛い。Googleドライブになんとか入れてるけど、余力が無くなった。
開発は次の段階に入った。ヒューマンインターフェースで、データ選択にTreeViewを初めて使う事にしたが、これがなかなか大変でした。結局、落ち着いたのは空のTreeNode配列を子ノード作って親ノード作成時に子ノードを持つノードを作成という感じで、最後にAddRange()でTreeViewコントロールに追加で出来た。しかし、データ量が多いので表示まで時間が掛かってしまう。なので、表示するデータ範囲を制限して時短するしかないかも。
あっ、今回ので配列の追加時に事前にサイズ指定していると、余分な配列がNullだとエラーになるので、
TreeNode tnYear = new TreeNode[0];
TreeNode tnYM = new TreeNode[0];
と宣言しておき、追加前に
Array.Resize<TreeNode>(ref tnMD, iMDcnt+1);
tnMD[iMDcnt] = new TreeNode(race.開催年月日.ToString("MM月dd日"));
Array.Resize<TreeNode>(ref tnYear, iYcnt + 1);
tnYear[iYcnt] = new TreeNode(String.Format("{0}年", iCurYear), tnMD);
Array.Clear(tnMD, 0, iMDcnt);
って感じで配列要素追加して入れる事で思った感じに出来た。親ノードに子ノード込みで作成後は子ノード配列を解放しておいた。