Rakuten

  • 楽天ダウンロード

    楽天市場

おすすめ本

天気予報

最近のトラックバック

  • event (夢茶爺&苦茶爺のPC奮戦備忘録)

カウンタ

VC

admax

« 2015年12月 | メイン | 2016年2月 »

2016年1月

2016年1月30日 (土)

VB.NETの配列は参照型

「VB.NETの値型と参照型について」の記事で「参照型」には「配列」があると触れましたが、 今回はそのことを詳しく見ていきます。

まずは配列の宣言方法ですが、以下の様に定義できます。

 Dim 配列名(指標上限値) As 各要素のデータ型

配列宣言の例としては以下の様になります。
3,4行目の配列の初期化を含む宣言の場合、「指標上限値」は省略する必要があります。

通常配列を扱う場合は、配列の添え字を指定して各要素のデータにアクセスします。 例えば以下の様な感じです。
「LBound」「UBound」は配列の指標の最小値及び最大値を返す関数です。 配列の全てを処理する場合、この関数を使うほうがバグが出にくいと思います。

そこで参照型であることを説明するために以下のソースを見てください。

このソースで表示される結果からわかるように、 「intArr2」と「intArr」が示すデータは全く同じものになります。 「intArr2」に「intArr」をコピーしているので当然なのですが、 「intArr」の配列の実体は5個のInteger型のデータの並びなのですが、 それを参照しているものが「intArr」の変数の中身なのです。 図で示すと以下の様な感じです。

Arr


更に以下のソースを見てください。 「intArr」を宣言後、要素にデータを設定し、その後で「intArr」に「Nothing」を入れています。

これを実行すると最後のコンソール出力の行でエラーが発生します。 「intArr」が指し示していた内容がクリアされたため、 最初に宣言したときの配列の実体への参照が出来なくなっているからです。

Arr2


このことから、配列の変数も、クラス変数と同様な感じが分かると思います。

■関連記事
VB.NETの関数の参照型データの引数での値渡しと参照渡しの違いについて
VB.NETの関数の戻り値が参照型について
VB.NETの配列のReDimについて
VB.NETの値型と参照型について
VB.NETの文字列型(String)について


2016年1月29日 (金)

VB.NETの値型と参照型について

VB.NETで変数として宣言できるデータ型は大きく分けて「値型」と「参照型」に分けられます。 「参照型」は、初めてVB.NETを使い始めた方にとっては、なかなか理解しにくい部分でもあります。 かく言う私もそのひとりではありますが。

「値型」は変数としてよく使う、Integer、Double、Decimal、DateTime及び構造体、列挙型などで、 「参照型」はクラス、配列などです。

「値型」のInteger、Doubleなどは直感的に分かりやすいのですが、 「参照型」の実際はどうなのか理解しにくいものです。
「値型」とは変数を保持しているメモリ上に直接データをアクセスできるもので、 「参照型」とはその変数に保持しているのは、参照型データの実体を指し示すポインタ的なものです。
言葉で説明すると何のことか分かりにくいので 「値型」と「参照型」を比較する為、構造体とクラスで説明します。

以下の様な構造体とクラスを宣言します。

このテスト用構造体を以下の様に使います。 このソースを適当なところで入力し、デバッグモードで1行ずつ実行させると分かりやすいです。

構造体のテストでは、1行目で構造体「ST1」の宣言をしていますが、この時点で「ST1」の実体がメモリに確保されます。 宣言の後で直接「ST1」のメンバ変数「nTest」に1を設定します。
その後で構造体「ST2」の宣言し、「ST2」に「ST1」を代入していますが、 「ST2」に割り当てられた実体に「ST1」の全てがまるまるコピーされます。
「ST2」と「ST1」の実体は全く別の独立したメモリ領域に存在していますので、 「ST2」のメンバ変数「nTest」に2を設定しても、「ST1.nTest」および「ST2.nTest」は異なる値を保持しています。

クラスのテストでは、1行目でクラス「CT1」の宣言をしていますが、この時点ではCT1には実体は設定しておらず、 値的には「Nothing」になっています。尚、値が「Nothing」である参照型の変数のメソッドやプロパティにアクセスしても エラーが発生します。

その後の「New」を行うことで、「ClassTest」の実体がメモリに確保され、その参照が「CT1」に代入されます。 参照とはメモリに確保された「ClassTest」の入れ物を指し示すポインタの様なものです。
この時点で「CT1」のメンバ変数にアクセスが可能になります。

クラスのテストでは、4行目でクラス「CT2」の宣言を行いますが、当然「CT2」の中身は「Nothing」のままです。 ここで5行目で「CT2」に「CT1」の値をコピーしています。 値のコピーと言っても、中身は「ClassTest」の実体メモリへの参照する値です。
(「ClassTest」の入れ物を指し示すポインタのコピー)

最後の行で「CT2」を使って「CT2.nTest」へ2を設定しています。 ここで「CT1」の値をデバッガ等でみますと「2」になっているはずです。 参照型を初めて見る方にとっては、おやと思うでしょうが、 「CT2」も「CT1」もメモリ上の同じ場所を指し示しているので、 「CT1.nTest」で見ても「CT2.nTest」で見ても同じ値になります。

尚、クラス宣言と実体生成を以下の様に記述できます。 「CT2」もNewで生成すれば、全く別のクラス領域を指し示すことになりますので、 「CT1.nTest」と「CT2.nTest」は別の値になります。

デル株式会社

■関連記事
VB.NETの関数の参照型データの引数での値渡しと参照渡しの違いについて
VB.NETの関数の戻り値が参照型について
VB.NETの配列のReDimについて
VB.NETの配列は参照型
VB.NETの文字列型(String)について


2016年1月28日 (木)

VB.NETの文字列型(String)について

プログラミングにおいて文字列型「String」はいろんな場面で使います。 名前を表示する時に使ったり、数値を文字列型で退避したりと枚挙に暇がありません。

この「String」ですがよく使う数値型のInteger型やDouble型、Decimal型などとは性格が異なり内部的には「クラス」の扱いなのです。 「クラス」は変数を宣言してもその変数を初期化(インスタンス化)しないと、その「クラス」のプロパティやメソッドが使えません。 使えないというか、インスタンス化されていない「クラス」のプロパティにアクセスするとその時点でエラーが発生します。 以下はエラーの発生するソースの例です。



変数 str を初期化せずにString型のLengthプロパティを使うとエラーが発生します。 「NullReferenceException」エラーが発生します。(NULLであるオブジェクトを参照したというエラー)

String1



このエラーを回避するには、文字列型の宣言するところで初期化(空文字を代入する)を行ってから、プロパティやメソッドを使います。 また、文字列長のみ知りたいのであれば、標準で備わっている「Len」関数を使います。



Microsoft.VisualBasic.Stringsモジュールには昔のBasicを引きずった関数がいろいろありますが、 その関数を使うか、文字列のクラスのメソッドを使うかは好みの問題かと思います。 今後は「String」クラスの「Substring」メソッドを使うのが主流になるとは思います。

但し、「Left」「Right」「Mid」の関数は昔から便利だったので結構使いたくなります。 これらの関数の「String」クラスの「Substring」メソッドでの方法を以下に記します。

■関連記事
VB.NETの関数の参照型データの引数での値渡しと参照渡しの違いについて
VB.NETの関数の戻り値が参照型について
VB.NETの配列のReDimについて
VB.NETの配列は参照型
VB.NETの値型と参照型について


2016年1月27日 (水)

VB.NETでOleDBを使ったエクセルファイルへのアクセス

前回はCOMオブジェクトを使ってエクセルファイルのアクセスを行いましたが、今回はOleDBを使います。
COMオブジェクトだとプロセスがメモリに残ることを気にしないといけませんが、OleDBでは気にしなくても良いようです。

以下のソースでは引数としてエクセルファイルのファイル名を指定しています。
関数の先頭で、関数内で使用するOleDB接続クラス、OleDBデータアダプタクラス、データテーブルクラスの宣言を行っています。 最初にOleDB接続クラスを使ってエクセルとの接続を行います。 ファイルの拡張子が「xlsx」と「xls」では接続されるOleDBが異なります。 「xls」では「Microsoft.Jet.OLEDB.4.0」だったのですが、「xlsx」では「Microsoft.Ace.OLEDB.12.0」になります。

次に、OleDBデータアダプタクラスを使ってエクセルシートのデータにアクセスします。 エクセルのシートをデータベースのテーブルの様に扱えます。 SQL文の中のFROM句で「Sheet1$」と記述している部分がそうです。 抽出範囲を指定する場合にはソースの様に「Sheet1$A1:C10」とすれば、 A,B,Cカラムの1行目から10行目までの指定になります。

データアダプタを作成後、データアダプタのメソッド「Fill」でデータテーブル、 エクセルのシートからデータを全て取り込みます。 後は、データテーブルから1行ずつデータ行を取得しデータ処理を行います。
以下のソースはテストですので単にデータを文字列として連結して表示しています。

関数の終了処理では使用したオブジェクトの解放を行います。


尚、今回の処理で以下のエラーが出た場合はMicrosoftの再頒布可能コンポーネントをインストールして下さい。

「'Microsoft.Ace.OLEDB.12.0' プロバイダはローカルのコンピュータに登録されていません。」

■Microsoftのリンク先
Microsoft Access データベース エンジン 2010 再頒布可能コンポーネント


デル株式会社


2016年1月25日 (月)

CSEを使用したPostgreSQLのテーブルにCSVデータ入力(インポート)

「CSE」を使ってPostgreSQLのデータベースのテーブルに、CSVデータ入力(インポート)を行ってみます。

まず最初に、前回のCSVデータ出力で出力された「dt_data1.csv」ファイルをCSEで入力してみます。 「DBエクスプローラ」に表示されているテーブル「dt_data1」の上で右クリックします。 メニューの中から、真ん中下あたりの「データをインポート」を選びます。

Data1csvinp1

「データをインポート」を選択した後に以下の図の様に、「インポートするファイルを指定して下さい」ダイアログが表示されます。 「dt_data1.csv」を選択し「開く」ボタンをクリックします。

Data1csvinp2

インポート処理のメッセージがコンソールに表示されます。 「dt_data1.csv」のデータはテーブルの中に既に存在しますので、3行のエラーが表示されます。 当然インポート処理は失敗となります。

Data1csvinp3

そこで、新しいCSVファイルをテキストエディタで作成してみます。 「dt_data1-inp1.csv」として以下の図の様に3件のデータを作成します。

Data1csvinp4

再度「DBエクスプローラ」に表示されているテーブル「dt_data1」の上で右クリックし、 「データをインポート」を選択します。 今回は「dt_data1-inp1.csv」のファイルを選択します。

Data1csvinp5

インポート処理の様子が下図の様に、コンソールウインドウに表示されます。

Data1csvinp6

インポートされたか確認する為、「DBエクスプローラ」に表示されているテーブル「dt_data1」の上で右クリックし、 「全データを開く」を選択します。

Data1csvinp7

これで、CSEでのCSVファイルのインポートの説明を終わりますが、 上の例でも示しましたが、インポートするCSVファイルのデータが、 テーブルに既にあるデータと キーが重複する場合は注意が必要です。

■関連記事
スッキリわかるSQL入門 ドリル215問付き! スッキリわかるシリーズ
CSEからPostgreSQLへの接続
CSEの使い方、PostgreSQLテーブル作成とコンソールのグリッドからのデータ入力
CSEを使用してPostgreSQLテーブルの内容をCSVデータ出力(エキスポート)
CSEからORACLEへの接続


達人に学ぶDB設計 徹底指南書【電子書籍】[ ミック ]

価格: 2,808円
(2016/09/29 13:53時点 )

感想:1件


2016年1月23日 (土)

CSEを使用してPostgreSQLテーブルの内容をCSVデータ出力(エキスポート)

「CSE」を使ってPostgreSQLのデータベースのテーブルからCSVデータ出力を行ってみます。

「DBエクスプローラ」に表示されているテーブル「dt_data1」の上で右クリックします。 メニューの中から、真ん中あたりの「全データをエクスポート」を選びます。

Data1csv1

「全データをエクスポート」を選択した後の表示が以下の図の様に、 「ファイルの保存先」を指定するダイアログが表示されます。 初めてこの処理を行う時のデフォルトのフォルダは「CSE.EXE」が存在するフォルダです。 ファイル名のデフォルトは「テーブル名.csv」ですので、今回は「dt_data1.csv」となります。

Data1csv2

エキスポート処理のメッセージがコンソールに表示されます。

Data1csv3

エキスポートされたCSVファイルをテキストエディタで開いてみます。 各データは全て値の前後に「"」(ダブルコーテーション)で囲まれていて、文字列として出力されています。

Data1csv4

■さらに、データの条件付けを行ってのCSV出力を行ってみます。

「DBエクスプローラ」に表示されているテーブル「dt_data1」の上で右クリックします。 メニューの中から、「条件を指定してデータをエクスポート」を選びます。

Data1csv21

「条件を指定してデータをエクスポート」を選択した後の表示が以下の図の様に、「検索条件 - dt_data1」が表示されます。

Data1csv210
「出力列を指定」及び「オーダー列を指定」を指定して、エキスポートを行います。 両方にチェックを入れると以下の表示になります。 画面は最初のカラムの「datano」に検索条件として「in (2,3)」として「datano」が2または3のデータを抽出します。 さらに「オーダー」にもチェックを入れて「datano」順とします。

Data1csv22
上図で「OK」ボタンをクリックすると、以下の「ファイルの保存先」を指定するダイアログが表示されます。 先ほどとは異なるファイル名(dt_data1-1.csv)を指定してみます。

Data1csv23
エキスポートされたCSVファイルをテキストエディタで開いてみます。 「datano」が2および3のみのデータのみであり、「datano」順になっています。

Data1csv24

以上の様に比較的簡単にテーブルの内容をCSVファイルに出力することができます。
この機能だけでも「CSE」を使ってみる価値はあると思います。

■関連記事
CSEからPostgreSQLへの接続
CSEの使い方、PostgreSQLテーブル作成とコンソールのグリッドからのデータ入力
CSEを使用したPostgreSQLのテーブルにCSVデータ入力(インポート)
CSEからORACLEへの接続



スッキリわかるSQL入門 ドリル215問付き! スッキリわかるシリーズ

達人に学ぶDB設計 徹底指南書【電子書籍】[ ミック ]

価格: 2,808円
(2016/09/29 13:53時点 )

感想:1件

2016年1月21日 (木)

CSEの使い方、PostgreSQLテーブル作成とコンソールのグリッドからのデータ入力

「CSE」を使ってPostgreSQLのデータベースにテーブルを作成し、データを簡単に入力してみます。

最初にテーブルの作成を行います。 CSEのメイン画面で以下の図の様にCREATE文をキー入力し、 実行ボタン(ツールバーの「!」もしくは、「メニュー」⇒「データベース」⇒「実行」)をクリックします。
コンソールには実行結果が表示されます。 Create2

作成されたテーブルが「DBエクスプローラ」に表示されますので、 テーブル「dt_data1」の上で右クリックします。 メニューの中から、一番上の「全データを開く」を選びます。
「pg_hba.conf」はPostgreSQLがインストールされているフォルダ内の「data」フォルダ内に存在します。
Data11

「全データを開く」を選択した後の表示が以下の図の様に、コンソールに「dt_data1」の内容を表示されます。 このグリッドにデータを入力していきます。(図は3件のデータを入力した様子)
Data13

グリッドにデータを入力後、「メニュー」⇒「データベース」⇒「編集の反映」を選択します。 以下の確認メッセージが表示されますので、「OK」をクリックします。 Data14
Data1conf

テーブルへの登録のメッセージがコンソールに表示されます。
Data1conf2

再度「DBエクスプローラ」のテーブル「dt_data1」上で「全データを開く」を選択すれば、 入力されたデータがコンソールの部分に表示されるはずです。
■関連記事
CSEからPostgreSQLへの接続
CSEを使用してPostgreSQLテーブルの内容をCSVデータ出力(エキスポート)
CSEを使用したPostgreSQLのテーブルにCSVデータ入力(インポート)
CSEからORACLEへの接続


達人に学ぶDB設計 徹底指南書【電子書籍】[ ミック ]

価格: 2,808円
(2016/09/29 13:53時点 )

感想:1件

2016年1月18日 (月)

CSEからPostgreSQLへの接続

久々にCSE「Common SQL Environment」を使ったPostgreSQLへの接続を行う必要がありましたので、 その時のやり方をまとめてみました。
PostgreSQLと言えば「pgAdminⅢ」がありますが、CSEも使い勝手がいいので利用しています。

まず最初にPostgreSQLのクライアント認証の設定を変更する為に「pg_hba.conf」の編集を行います。
「pg_hba.conf」はPostgreSQLがインストールされているフォルダ内の「data」フォルダ内に存在します。
(私の環境では C:\Program Files\PostgreSQL\9.2\data に存在します)
「localhost」からアクセスをする場合は、「pg_hba.conf」をテキストエディタで開いて、 以下の様に設定して下さい。(「#」はコメント行です。)



尚、全てのアクセスを許可する場合は、以下の様に設定して下さい。



上記の修正が終わった後で、「pg_hba.conf」を上書き保存し、PostgreSQLのサービスを再起動します。

次に、「libpq.dll」をCSEが存在するフォルダに入れます。
このDLLですが、現在のCSEの紹介されているページのリンクは切れている様ですので、 以下のURLのところで該当するファイル (「日本語Windows版 libpq」..... libpq-6.5jp.zip)をダウンロードし 回答して、「libpq.dll」をコピーします。 (URLは直接リンクではありませんので、文字列をコピペして下さい)
「http://www.psn.ne.jp/support/database/psql.html」

CSEの起動を行い。「メニュー」の「データベース」⇒「接続」を選択します。

Connect1 Connect2

コンソール画面に「接続されました」の表示がされたら、接続が完了したことになります。


デル株式会社
■関連記事
スッキリわかるSQL入門 ドリル215問付き! スッキリわかるシリーズ
CSEの使い方、PostgreSQLテーブル作成とコンソールのグリッドからのデータ入力
CSEを使用してPostgreSQLテーブルの内容をCSVデータ出力(エキスポート)
CSEを使用したPostgreSQLのテーブルにCSVデータ入力(インポート)
CSEからORACLEへの接続

2016年1月12日 (火)

VB.NETでメモリにプロセスが残らない、エクセルファイルの処理について

VB.NETでエクセルファイルを処理する場合、エクセルのプロセスがメモリ上に残るときがあります。
プロセスにエクセル(EXCEL.EXE)が残ると、エクセルを扱うプログラムでエクセルファイルのアクセスを行い、 同時にエクセルを起動して処理したい場合に不都合が発生します。
VB.NETプログラムからエクセルを扱う場合は、以下のソースの様にエクセルアプリケーションオブジェクト、 ブックスオブジェクト、ブックオブジェクト、シートオブジェクト等を利用しますが、それぞれ使用した後では オブジェクトを廃棄してやる必要があります。
また、オブジェクトを2回参照すること、つまり"."(ドットでの参照)の参照は1回のみにします。
さらに、処理を終えるところではブックオブジェクトはCloseし、エクセルアプリケーションオブジェクトはQuitする様にします。



尚、今回のエクセルの処理で煩雑にならないように以下の関数を定義しています。
・「_ReleaseComObject」はオブジェクトの参照を解放するためのローカル関数です。
・「_ObjToStr」はオブジェクトの値から文字列へ変換するためのローカル関数です。