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が必要になる。

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