掲示板お問い合わせランダムジャンプ



この広告は30日以上更新がないブログに表示されております。 新しい記事を書くことで広告を消すことができます。

Top Index

2014年07月27日
例外処理入門(その2)
例外処理入門(その1)の続き。

例外の再発生(その1:ThrowとThrow exの違い)


「例外発生時の事後処理を書き、エラー処理は呼び出し元に任せる」ということはよくあります。
エラーのメッセージ処理がそうですね。
例を挙げると、こんな感じ。

※例外処理入門その1で「Exceptionクラスを直接発生させたり、捕まえたりするな」と言っておりましたが、
 毎回あれを考慮したコードを載せていては情報量が不必要に多くなるので敢えてこのように書いております。
 ご了承ください。

ここで23行目に注目!
例外を再発生させるコードは、
Throw
です。
たまに
Throw ex
と記述する人がいます。
たぶん、例外の任意発生(Throw New Exception)の構文からこう書いてしまったのでしょうが、
Throw とだけ書くようにしてください。

強調するのにはわけがありまして、「Throw だけ」と「Throw ex」ではエラーが発生した位置情報(StackTrace)が異なってくるからなのです。
以下にStackTraceの実例を挙げます。

続きを読む ...
 
[ 投稿者:mk3008 at 10:57 | VB.NET | コメント(3) | トラックバック(0) ]

2014年07月26日
例外処理入門(その1)
VB.NETではTry〜Catch文を使用して簡単に例外処理が書けますが、
使いこなすにはとても奥が深いものとなっています。
そこで、例外処理の勘所をメモしておきます。

Throw文で例外を起こそう


例外処理を学ぶためには、まず意図的に例外を起こす方法を覚えましょう。
意図的に起こすことで、例外とどのように付き合えばよいかが見えてきます。



Throw New Exception("エラーメッセージ")

と記述すればそこでプログラムがエラーで停止します。

ここでポイント

・例外処理をせずに例外が発生するとプログラムは問答無用で止まります。
・VisualStudio上でデバッグ中に例外が起きた場合は、場所(クラス、行)、理由(例外名)がわかりますが、
 EXEにしたあとでは「<アプリケーション名>は動作を停止しました」と出るだけでノーヒントです。


EXEにしてもどんなエラーが出たのかがわかるように修正しましょう。

Try〜Catch文で例外を捕まえよう




続きを読む ...
 
[ 投稿者:mk3008 at 09:00 | VB.NET | コメント(0) | トラックバック(1) ]

2014年07月20日
Selectクエリの結果をファイルに書き出す(XLSX編)
ClosedXML
※前回は「Selectクエリの結果をファイルに書き出す
VS2010+VB2010+.NET4+ClosedXML

ClosedXMLを使用したら瞬殺でしたので、
codeplex、またはnugetからdllを入手し利用することをお勧めします。

書いたコートはたったこれだけ。

Using book As New XLWorkbook
Using sheet = book.Worksheets.Add(source, sheetName)
End Using
book.SaveAs(path)
End Using

一応拡張メソッドも作ってみましたが、本家の関数も十分使いやすい。

DataTableをXLSXで出力したときの特徴
・ヘッダーに色が付く
・オートフィルタが付く(これはどうでもいいかな)
・罫線が引かれている
・電話番号のような数字だけで構成されてる文字はちゃんと文字として扱われる(先頭のゼロが消失したりしない)
・フォントは「Calibri」(あんま使ったことない)
・ウインドウ枠の固定はされていない
・XLS形式(Excel2003形式)での出力はサポートサポートされていない。

最後にパフォーマンスも見てみます。

続きを読む ...
 
[ 投稿者:mk3008 at 13:39 | VB.NET | コメント(0) | トラックバック(0) ]

2014年07月19日
Selectクエリの結果をファイルに書き出す
VB2010+VB2010+.NET4

よく使うので整理しときます。
やり方はいろいろあると思いますが、よく使いそうなのは以下の2つ。
A DataReader→DataTable→CSVファイル
B DataReader→CSVファイル

細かいこと(ソースコード)は後に回すとして、使い方はこんな感じ。
[A]
Dim tbl As New DataTable
tbl.Load(cmd.ExecuteReader)
Using sw = New StreamWriter("test.csv")
tbl.ToCsv(sw)
End Using
[B]
Using sw = New StreamWriter("test.csv")
cmd.ExecuteReader.ToCsv(sw)
End Using

せっかくなので、AとBでどれぐらい実行速度が違うか検証してみたところ、
Bの方が3〜4倍程度速い

以下、ソースコード


続きを読む ...
 
[ 投稿者:mk3008 at 17:23 | VB.NET | コメント(0) | トラックバック(1) ]

StringBuilderのLengthプロパティは遅いか?速いか?
CSVファイルを書き出す時など、
delimiter(区切り文字)を足すべきかどうかを判断する処理を多数書くことになります。
具体的にいうと、
・行データが空なら区切り文字を付けずに値を結合する
・それ以外は区切り文字を足してから値を結合する
の分岐を行うため、行が空かどうかを調べるわけですね。

行データをStringBuilderクラスで管理するとした場合、
今行データが空なのかどうかは調べる方法として
A Lengthプロパティで評価する。
B 初めて値が追加されたとき、フラグ変数にONにしてフラグ変数で評価する。
ぐらいが考えられます。

速度的にいうと「B」の方が速そうですが、コーディング的には「A」の方がシンプルですね。
で、「Aのコードは本当に遅いのか?」を調べたいと思います。

Dim s As New StringBuilder
Dim flag As Boolean = False

Dim checkPerformance =
Sub()
Dim sw As New Stopwatch
sw.Start()
For n As Integer = 1 To 100000
'無駄にコールする
If s.Length <> 0 Then flag = True
Next
sw.Stop()
Debug.Print("Length Check : " & sw.ElapsedMilliseconds)
End Sub

checkPerformance.Invoke()

For i As Integer = 1 To 1000
s.Append("*")
Next

checkPerformance.Invoke()

こんな無意味なコードを走らせて速度計測してみるわけです。

で、結論
Lengthプロパティの評価速度は文字列長に依存せず、高速に評価される。

PC環境にもよりますが、私のPC(Core i7 2.93GHz)で
10万回Lengthプロパティをコールして1msecかかる程度でした。

また、Appendを1,000回しようが、1,000,000回しようが、
Lengthプロパティの評価速度は変わりませんでした。
[ 投稿者:mk3008 at 12:05 | VB.NET | コメント(0) | トラックバック(1) ]

2014年07月10日
時系列マスタとジャーナルデータとの紐付
唐突にSQLネタです。

マスタを時系列で管理(特定期間内ごとに値がかあるもの)したいということはよくあります。
消費税マスタなんかがよい例でしょう。
単純に設計するなら…

  Taxesテーブル
PK StartDate
  TaxRate

こんな感じでしょうか。
構造としてはこれでよさそうですが、ジャーナルデータ(契約とか)とリレーションを張ろうとすると一瞬「?」となりますよね。


例として
  Contractsテーブル
  ContractDate
のようなテーブルとリレーションし、
契約日ごとの税率を求めることを考えてみます。
単純なjoin句で紐付することはできなさそうなので、
以下のようにアプローチすることにしましょう。

1. Taxesテーブルは開始日しか持っていないので、終了日を求めて期間指定できる形式に加工する。
  ※終了日を物理的に列定義してもいいですが、編集時に整合性が壊れることがあるので
   極力持たないほうがいいでしょう。

2. 期間指定できるようになったTaxesテーブル(クエリ)を使い、
  betweenで契約日を挟んでやる。

できたクエリはこんな感じ。





続きを読む ...
 
[ 投稿者:mk3008 at 00:01 | SQL | コメント(0) | トラックバック(0) ]