SyntaxHighlighter

2020-10-09

SQL 改行コードの処理

SQL中に、改行コードはCHAR(13)あるいはCHAR(13)+CHAR(10)が該当します。 
それらを用いて保存すると、CSV出力やExcelにコピーする際にちょっと厄介です。

次のコードで、一括それら改行コードを削除できます。

UPDATE [TableName] SET [FieldName] = REPLACE([FieldName], CHAR(13) + CHAR(10), '') WHERE [FieldName] LIKE '%' + CHAR(13) + CHAR(10) + '%';
UPDATE [TableName] SET [FieldName] = REPLACE([FieldName], CHAR(13), '') WHERE [FieldName] LIKE '%' + CHAR(13) + '%';

2020-09-28

PrismでDIコンテナを使用するRegister vs RegisterInstance vs RegisterSingleton

Prism 7以降に、サービスを注入する際に、Register, RegisterSingleton, RegisterInstance三つのメソッドが使えます。それぞれを使用する場面について、ちょっとした解説を書き残します。

実際にサービスを登録する場合、そのサービスを使用する場面によって、異なるサービスを使用するべきと言われていますが、次のように大まかに分けています:

  • Register 該当Interfaceが注入された場合、DIコンテナが自動的に新しいインスタンスを生成し、終わったときにインスタンスを廃棄する。
  • RegisterSingleton 全部の注入には同じインスタンスで対応する。
  • RegisterInstance 主にRegisterSingletonと同じだが、生成されるInstanceは自分で管理する場合使用。

では、どれを使うほうか正解ですか?

まぁ、ほとんどなサービスはSingletonとして登録されます。ViewModelはそれらのサービスによって通信できるようにするためです。例えば、EventAggregatorサービスで、あなたが持つあるViewModelからEventを発行する際に、他の何かはそのことを知らせたいですが、それは同じインスタンスのサブスクリプションを発行者サービスとして登録している場合受け取ることができます。とはいえ、WCFクライアントは、同じシングルトンを使用する必要はありません。なぜならば、その処理はサーバー側が処理すべきなのです。

場合によっては、インスタンスを登録することは嫌がります。特に登録(register)と逆解析(resolve)が混在している場合。インスタンスを作成する際にそのインスタンスの依頼先をすべて確保する場合も。(だからResolveを呼び出す。その呼び出す自体がやや気に障るが。)

ひとつのメソッドですべての必要項目を全部登録してしまえば問題は減りますが、複数の交互依頼モジュールがある場合にはちょっと頭痛いです。

訳者注記

最近のプロジェクトでDBのアクセスサービスに、Singletonの登録にはちょっと問題あると気付きました。EntityFrameworkのDbContextを利用していますが、すべての画面が同じDbContextを登録した場合、DB側に更新がある場合、リアルタイムにReloadができません。渋々にSingletonを解除して、画面ごとに新しいDbContextを使うことにしたら、キレイに解決しました。ネットで検索したら、DbContextは長時間メモリに滞在するようには良い影響はしないようです。とりあえずEntityFrameworkのDbContextはSingleton登録しないようにする方が良いです。あるいは必要の場合自分でインスタンスを管理する方が良いかもしれません。

2020-08-16

[IAmTimCorey]15 Visual Studio Editor Tips

這是一連串的文章,關於我所知道的C#推廣者 Tim Corey 頻道 IAmTimCorey 的內容。
這同時是我的學習筆記。以下的中文用詞,大部分是個人慣用語。一般來說會附上英文原詞,方便大家對照。

原始連結: https://www.youtube.com/watch?v=qv6ZflueASY

這次的題目,是有關那個號稱地表最強IDE的Visual Studio在設定上的一些小技巧與內容

2020-08-05

Excelに外部データベースを自動取り入れする方法

ここで使用する技は、次の使用状況を前提に考えた:

- 参照するキーはExcel上もともとある資料
- 外部データベース(今回はSQL Serverを例にする)には、すでに必要な資料を整理してある(つまり、DB内のTableのJOIN等は、Viewなどの形で、すでに整理してある)

使用する技の中身を明かすと、次のように分解する:
1. 必要なパラメータをそれぞれTableにする(Queryを掛けるときには必要)
2. それぞれのパラメータをクエリに変換。(後ほど詳しく説明)
3. 本当にデータをクエリし、必要のパラメータフィルタはひとまず「定数」で設定。
4. 上記定数のパラメータをそれぞれクエリに入れ替え。

それでは、ステップ分けて説明する。

パラメータをテーブルに設定

例として、MicrosoftのNorthwindデータベースをSqlServerのLocalDBに構築した前提で進む。目標としては[Order Details Extended]というViewの中で、OrderIDが同一するものを抽出する。

では、まずは[OrderID]をTableに設定する。A1のセルにOrderIDと入力し、例えの内容として、"10254"をA2に入力する。

A1のセルをクリックして、[挿入] - [テーブル]をクリックして、該当範囲をテーブルに変換する。ショートカットは[Ctrl-T]を押しても同じようなものが出る。注意すべきのは、「先頭行をテーブルの見出しとして使用する」にチェックを入れること。Excelの設計上、必ず一番上のマスにタイトルを入れるので、自分でタイトルを入れないと、Excelが勝手にタイトルを付けておくようになってしまう。

以上で、パラメータをテーブルに変換する手順が終わる。

パラメータをクエリに変換

次に、それぞれのパラメータテーブルをクエリに変換していく。
テーブルの一部をクリックして、[データ] - (取得と変換) - [テーブルから]をクリックする。とすると、Power Queryエディターが出てくる。

先ずはタイトルの部分を注目。ここでは「数値」としてマスの内容を認識しているはず。どっちにしよう、SQLクエリを掛けるのに、「文字」タイプが一番ベスト。ゆえに、ここは一度文字へ変換しておく。また、テーブルが複数欄になってしまった場合、ここで一度整理整頓を行う。一つのパラメータは一つの欄だけにすることが大事。

そして、1欄目のところに右クリックして、「ドリルダウン」をクリックする。とすると、ちょっと変な形になるが、使用上支障はないので、無視する。右側にプロパティが出るので、ここで名前QueryOrderIDとする。

そのままの形で、ホーム - 閉じて次に読み込む (閉じて読み込むの裏にある)をクリックする。読み込み先が聞かれてくるが、「接続の作成のみ」として読み込み。

上記の繰り返して、すべてのパラメータをクエリへ変換しておく。

一度本クエリを行う

データ新しいクエリデータベースからSqlServerデータベースからをクリック、接続のダイアログを出す。サーバーは (localdb)\MSSQLLocalDB で、データベースは Northwind となる。

実際に接続するときには、毎回接続情報を聞いてくるが、そこは各自に解決してください…

今回接続したいテーブル(実はView)は前述の「Order Details Extended」、そして下の「編集」をクリックする。

それぞれパラメータを掛けたいところに、タイトルの右にあるドリルダウンボタンをクリックし、フィルタを掛ける。今回の案では、10254とフィルタする。

終了したときは、同じホーム ⇒ 閉じて次に読み込む として、同じ表のA4セルに読み込む。

クエリのパラメータを入れ替える

鬼門が来た。前のステップで作成した本クエリのところをクリックして、編集を掛ける。編集を行いやすいように、表示 - レイアウト - 数式バー にチェックを入れる。

とすると、数式バーに「[OrderID] = 10254」のような文字が書いてある。10254のところをOrderIDと書き換える。

同じように、掛けたいパラメータのところをそれぞれ対応するクエリ名に入れ替えて置く。

完成したら、閉じて読み込む

以上で、完成。

おわりに

SQLクエリを変更可能なパラメータで行うには上記のやり方で可能だが、実際に操作してみてはやはり面倒くさいし、いろいろセキュリティ上の問題で、ネットでこれらの方法を展開していないのは理由が分かる気がする。自分でもやってみて「VBAにした方が楽だなぁ」と思ったりする。なにかいい方法があれば教えてください。




人気の投稿