メタ文字のエスケープ

sqlインジェクション対策の一つのメタ文字のエスケープ処理。ローカルで利用するwindowsアプリケーションなので、インターネット上のwebアプリのように攻撃されることはないけれど、操作している上でメタ文字を入力してしまうということが起こりうるため一応対策。

“‘”(シングルクォート)をエスケープ処理する。入力文字列中にシングルクォートが存在すれば、その前にもう一個シングルクォートを挿入するようにコーディングする。シングルクォートを見つける手段は正規表現を使うことにする。

サンプルコード

Imports System.Text.RegularExpressions

‘文字列中にシングルクォートが存在すれば、シングルクォート2個に置き換える
Dim inputedValue As String = Regex.Replace(Me.textBox1.text, “‘”, “””)

windowsアプリケーションに最新バージョン確認の機能を追加する

現在使用しているwindowsアプリケーションのバージョンが、公開されている最新バージョンであるかどうかを確認するための機能を追加してみる。どういう実装にするのが最善かまだ見えていないけれど、単純に考えるなら最新バージョンの情報があるファイルをサイトからダウンロードして、そのファイルにあるバージョン情報を読み取り、現在のアプリケーションのバージョンと比較をするというのが簡単に実現できそうだ。

この機能を実現するにはインターネットにアクセスして対象のファイルをダウンロードするという方法をとらなければならない。アプリケーションを公開する側では、公開時にリリースするソフトと一緒にそのバージョンが記されたファイル(テキストファイルなど)をするという準備が必要になる。ソフト側では最新バージョンのチェックを行ったらそのバージョンが記されたファイルをダウンロードするという手順になる。筋道としてはこんな感じだろうか。

注意点は、

  • インターネットに接続できない場合の対処
  • 対象のファイルが存在しなかった場合の対処

・・・ということを想定して実装してテストを繰り返せば致命的なエラーにはならない、かな。

サンプルコード

MonthCalendarの表示がxpとvistaでサイズが異なる

visual studio 2005のwindowsアプリケーションを作成する場合に使うコントロールの一つにMonthCalendarというのがある。これをフォーム内に配置して表示確認を行ったところ、どうもxpとvistaではデザインとサイズが大幅に異なるようになっている。しかもサイズの変更ができず、どちらかに合わせることもできない。

xpとvistaの両方で同じように表示する方法は一つあって、コンパイル時の設定でxpのスタイルを無効に設定することで一応、同じように表示はすることができる。ただこれはデザインがクラシックスタイルになってしまってせっかくのvistaの美しいインターフェースが使えなくなってしまう。

フォームに埋め込み式でMonthCalendarを使う場合にはサイズの問題でxpとvistaに両対応させることは難しい。困った。

System.Data.OleDb.OleDbException: ファイル ’ファイルパス ’ が見つかりませんでした。

データベースファイルを相対指定にしていて、openfiledialogでローカルのファイルを選択後に、データベースのファイルの指定が絶対指定に変わってしまった。その結果、当然ながらデータベース接続エラーが発生するようになった。fileopendialogを使うと別の部分で相対指定しているファイルパスを変更してしまうのだろうか。とりあえず。データベースファイルのパスは絶対パスに変更することでエラーは出なくなった。

テーブルのフィールドのデータ型を調べる

プログラムで使っているテーブルのあるフィールドが設計ミスで使われていないことに気づき、せっかくだからそのフィールドのデータ型を変えて別の用途に使ってみようというトリッキーなことをやろうとしたけれど、やっぱりやめることにした。こういうのは大抵上手くはいかず、別のもっと良い方法がある。でも、途中まで調べたので記念に残しておく。

やろうとしたことは、テーブル内にある使ってないフィールドのデータ型=char型をlongchar型に変えてみようとした。プログラムの処理としては、フィールドのデータ型がchar型ならlongchar型に変えるsqlを走らせる、というもの。

データ型を取得する際のポイントは、OleDbCommandのExecuteReader().GetDataTypeName(0) という部分。これで対象のフィールドのデータ型が手に入る。実際に取得してみたらdbtype_wvarcharという値が取得できた。

        dim sqlStrType as string = "select field1 from table1"

        Dim isDataType As OleDb.OleDbCommand = cn.CreateCommand
        Dim fieldType As String

        isDataType.CommandText = sqlStrType
        cn.Open()
        fieldType = is_data_type.ExecuteReader().GetDataTypeName(0)
        cn.Close()


        'char型の場合(=DBTYPE_WVARCHAR)
        If fieldType = "DBTYPE_WVARCHAR" Then

            'データ型をテキスト型からメモ型へ変換する
            dim sqlStrChange as string = "alter table table1 alter column field1 longchar"
            Dim changeType As OleDb.OleDbCommand = cn.CreateCommand
            change_type.CommandText = sqlStrChange
            cn.Open()
            changeType.ExecuteNonQuery()
            cn.Close()

       '通常の処理

            'longchar型の場合(=DBTYPE_WLONGVARCHAR)
        ElseIf fieldType = "DBTYPE_WLONGVARCHAR" Then

            '通常の処理

        End If

visual studioが不具合を起こした2

—————————
Microsoft Visual Studio
—————————
Microsoft Visual Basic 2005 コンパイラを作成できなかったため、プロジェクト ‘cdn_01’ を開けませんでした。Visual Studio を再インストールしてください。
—————————
OK キャンセル
—————————

orz

reportviewer はデータソースが複数あるとわけがわからない状態になる

rpds.pngvisual studioのreportviewer コントロールの設定で嵌ってしまったので備忘。reportviwerコントロールをフォーム上に配置したらレポートの設定をするためにrdlcという拡張子がついたレポート用のファイルを作成する。その作成が終わったらreportviewerのレポートとして設定しする。そのとき、データソースの設定で項目が複数あるとどうもデータのグラフへのバインドがうまくいかない。データソースには存在するデータのみを設定しなければグラフは描画されない。また、グラフへデータソースとして設定する場合に、そのデータソースのテーブルにnullが存在すると描画されない。null対策としてはIIF(isnull(field1),0,field1)というようなことで応急措置。

テーブルのデータをグラフ表示する、ただそれだけの単純なことなのにreportviewerの扱いを覚えるのに随分と時間がかかってしまった。それにしても、あらかじめdatasetをプロジェクトに作成して、そのdataset内のデータをグラフのデータフィールドとして設定しないとコンパイルができないという仕様はどうにかならんものだろうか・・・。

System.ArgumentException: 入力文字列の形式が正しくありません。列 initial_money に を格納できませんでした。 必要な型は Double です。 —> System.FormatException: 入力文字列の形式が正しくありません。

datagridviewにデータをバインドした時のこと。データグリッドへバインドされたテーブルのセルの値を変更しようと思って文字列を挿入しようとしたら

System.ArgumentException: 入力文字列の形式が正しくありません。列 initial_money に <-11809 -11809> を格納できませんでした。 必要な型は Double です。 —> System.FormatException: 入力文字列の形式が正しくありません。

(省略)

というエラーが出て挿入することができなかった。エラーの意味はわかるけれど、わからないのはいつの間にか列の型がdoubleという風に指定されていたということ。これは一体いつの間に決まってしまったのだろう。

そもそもデータグリッドの列に型が存在することをこの時に始めて知った。文字列とか数値とか画像とかいろいろ入れることができるのでobject型のようなものが設定されているかと思ったらもっと厳密に文字列ならstring型、数値ならdouble型という風にできている模様。

この今回のエラーのdouble型じゃないから数値を格納できないという、doubleという型が勝手に決められてしまったことが一番わからない。私はdouble型なんてどこにも使ってないのだから。

データグリッドにバインドした時に列の値が数値ならdouble型と判定されてしまうのか、それともdatasetを作成した時にそれは判定されてしまうのか、それとも何か他の知らないルールがあるのか。調査中。

その後

こんなエラーが発生した。

プロバイダで Double 値を特定できませんでした。たとえば、行が作成されたときに Double 列の既定値が使用できない状態で、使用者が新しい Double 値を設定していなかった場合が考えられます。

windowsアプリケーションにグラフを追加してみる

MSChartを使うことを諦めて別のグラフコンポーネントを探していたところ、visual studio 2005に標準でreportviwerというコンポーネントがあることに気づいた。reportというぐらいだから印刷用のコンポーネントと思いきや、グラフを表示することができるようになっている。vb6から.netへと変更した後でMSChartが無くなったらその代わりの物が無いとおかしいとは思っていたけれど、reportviewerという名前に変更になっていたとは今まで気づかなかった。

で、このコンポーネントを使うことにしてみたんだけれど、色々と不便なところが多い。reportviewerのレポートソースにrdlcファイルを設定するのだけれど、そのrdlcファイルというものが堅物でデータソースをあらかじめ設定しておかないといけない仕様となっている。後でコードでデータセットを作成してイベントでセットするつもりであっても。また、reportviewerからrdlc内のグラフへアクセスすることができない(今のところ私の知る限りでは)。なんかありそうなのだけれど、グラフのプロパティにアクセスをすることができない。さらに根本的な問題として、このコンポーネントは.net frameworkのコンポーネントに含まれては無い模様。利用するには別途reportviewerのdllが必要になる。

なんというかこれっていうグラフコンポーネントはないものだろうか・・・。

datagridの内容をmschartに表示

ボツになった案。vb6用のランタイムが無いとmschartは表示することができないので自分は使うことができないけど、誰かほかの人の参考になればと思って。やろうとしてたことのサンプルコードは下記に載せてあります。画像ファイルを貼り付けてグラフを表示するという方法もあるらしいけれど、都度データを送るだけで表示することができる分こっちの方が筋は良いと思う。ちなみに下記コードの大まかな内容は、datagrid1というデータグリッドがあって、その中にデータが既にバインドされてて、セルの1番目には日付が有り、セルの5番目には数値があり、日付と数値を対応付けてグラフ表示をさせようとしたもの。

vb.net用のアプリケーションでは使えないため、vb6用のアプリケーションを作成している方向け・・・って、今の時期にいるのだろうか?

サンプルコード

        Dim j As Integer = mainForm.datagrid1.RowCount
        Dim arrData((j - 1), 2) As Object


            For j = 0 To (mainForm.datagrid1.RowCount - 1)

                arrData(j, 1) = mainForm.datagrid1.Rows(j).Cells(0).Value.ToString
                arrData(j, 2) = mainForm.datagrid1.Rows(j).Cells(4).Value.ToString

            Next j


        mainForm.chart1.ChartData = arrData