tyosyoshinsy

VC++ で Micorsoft SQLサーバー と通信する方法

公開日:2021/3/29

今回は、VisualStudioのC++で、アプリケーションインターフェースの、OLEDBプロバイダを利用した、 データベースと SQL 通信 する方法を、紹介しようと思います。
アプリケーションから、Microsoft SQL サーバーにアクセスする方法は、Windowsのデータ ソース アドミニストレータ ( ODBC ) を利用して通信することができますが、アプリケーションのプログラム構築の方法では、ODBC の設定をしなくても通信を する事ができます。
今回は、 この ODBC の設定せずに、アプリケーションから直接、DB(データベース)に SQL 通信 できる、OLEDB プロバイダを利用した、 アプリケーションの通信方法の基本的な部分について紹介しようと思います。
このOLEDBプロバイダをを利用した通信方法は、OAD とか、 OLE とか、呼び方がいくつかあり、かつ ODBC関数 に比べ、 インターネット上の情報が本当に少くなく苦労したので、備忘録も兼ねて紹介しようと思います。

はじめに、テスト用のデータベースを準備する

まず初めに、アプリから SQL 通信 が確認出来るように、データベースとテーブルを準備します。
Microsoftのサイトから Microsoft SQLサーバー をダウンロードして、通信対象となるテストPCにインストールしておきます。 ※Microsoft SQLサーバーは無料でダウンロードできます。
SQLサーバーマネージメントスタジオ、を起動して、Windows認証から SQL Server認証に 変えて、インストール時に決めた ログインIDと、パスワードで、サーバーにログインして下さい。

OLEtest7

ログインが出来たら、今回のテスト用に新たにデータベースを用意します。
サーバーを右クリックして、新しいデータベース を選択します。名前は任意です。
※今回は、次に解説するサンプルプログラムの写真と合わせて、TEST_DB として作成します。

OLEtest8

新規データベース作成時に表示されるその他の設定項目は、とりあえずデフォルトのままで 問題ありません。 データベースが出来らた、テスト用のテーブルを作成します。

OLEtest9

TEST_DB のツリーを開き、テーブルの項目で右クリックをして、 新しいテーブル を選択してテーブルのデザインをします。

OLEtest10

フィールド要素は上記写真のようにします。
・一意のプライマリキー ⇒ READ_KEY
・データ1 ⇒ READ_DATA1
・データ2 ⇒ READ_DATA2
・データ3 ⇒ READ_DATA3
・データ4 ⇒ READ_DATA4
・データ5 ⇒ READ_DATA5
※プライマリキーは、検索が出来るように、テーブル内では唯一無二の値が格納される為の列とします。 その他は、任意の列名で問題ありませんが、こちらもとりあえず写真と同じ名前にします。

テーブルのデザインが出来たら、今度はこのテーブルに適用なデータをセットさせます。

OLEtest11

今、編集を行ったテーブルで右クリックをすると、 上位 200 行の編集 の項目が現れるので、をクリックすれば空のデータレコードが現れますので適当なデータを 入力してレコードを作成します。
ただし、READ_KEYは先述したとおり、同じデータがあっては駄目(というか検索できなくなる)なの他の行と被らない ように入力します。

入力が出来たらこれでSQLサーバーの準備は完了です。 次は、本題のアプリ作成に取り掛かります。

スポンサードリンク

 MFCの ダイアログベースのアプリでテストする

データベースの準備が出来たら、C++のアプリで、SQLサーバーと通信する、アプリケーションインターフェース アプリの作る手順について解説します。
初めに、アプリがどのような手順と手続き(関数)を利用してサーバーと通信できるかを理解するために、 土台となるアプリは、最も簡単なMFCのダイアログベースのアプリで基本的な通信部のプログラムを作っていきます。

今回は、Visual Studio 2008 ベースに紹介していきます。
ポイントとなる部分を紹介するために、細かい設定については割愛しますが、メインとなる通信のプログラムを作る部分(設定も)については、 今回紹介する方法をそのまま真似していただければ出来るに解説します。
まずは、新規作成からダイアログベースのアプリを選択して、新規プロジェクトを立ち上げます。

OLEtest1

アプリケーションの種類は、ダイアログベースのアプリを選択して、UNICODEライブラリを使用する、のチェックを 外しておきます。 また、お好みで、MFCの使用法 の項目で、どマシン(Windows)も機動できるようにしたい場合は、 スタティックライブラリでMFCを使用 のチェックを入れておけば実行ファイルのサイズが大きくなりますが、汎用性が高くなります。 この辺は好みでカスタマイズしてみて下さい。
次の以降の設定ウィンドウで表示される、ユーザーインターフェースの機能 、高度な機能、の設定項目は、今回 解説するプログラムにおいては設定による影響がないので割愛します。 ここも好みでカスタマイズしてみて下さい。

プロジェクトのメインクラスにプログラムを記述する

まずはじめに、ODBC関数を使わないSQL通信をするアプリを作る為に、OLEDBプロバイダ(ADO?)を 使用するための、DLL(ダイナミックリンクライブラリ)を、インポートする為の、コードを記述します。

OLEtest2

母体となるメインダイアログのクラスとなる、cpp ファイルの先頭付近に、
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" no_namespace rename("EOF", "EndOfFile")
と記述します。
※OLETEST_choDlg.cpp は、任意のプロジェクト名です。 新規でプロジェクトを作った時のソリューション名になることに注意して下さい。
※インポート定義ファイルが記述している通り、パスの先に msado15.dll ファイルがない場合も、その Windows でアプリが通信出来ないので これまた注意して下さい。 自分がテストをする環境でDLLがあるか確認しておきましょう。

通信を行う為の関数を作る

では早速メインとなる、通信の部分のプログラムを記述していこうと思います。
その前に、ダイアログの操作をするために、リソースビューに、簡単なコントロールを追加しておきましょう。
※この時に、リストボックスの動作オプションである、Sort の値を FALSE にしておきます

OLEtest4

リソースビューのツールボックスから、ボタンとリストボックスを選択して、適当な所に配置ます。 コントロールの配置できたら、 ボタンの方をダブルクリックして、ボタンクリックイベントの関数をあらかじめ作っておきます。
ボタンの配置が出来たら、クラスビューのツリーから、メインダイアログクラスの関数を追加します。 関数名は任意です。

OLEtest3

OLEtest5

今回のテストアプリは、この関数で完結するので、関数の戻り値の型は void 型で良いでしょう。
関数の準備ができたら、本題のプログラムをコーディングしていきましょう。

OLEtest13

メインの仕事をする部分のコードは少ないです。 とりあえずは、上記の写真と全く同じで良いので、 コーディングしてみて下さい。
ポイントとなるのは、通信先となるデータベースの環境によって異なる部分です。 主に、吹き出し部分で説明している内容になります。
SQLクエリの部分も含めは、文字列を即値みたいに記述してしまっているので、本当のプログラムでは、使用用途に応じて 工夫が必要になります。

それでは、実際にアプリを起動して通信するか確認してみましょう。

OLEtest12

無事に通信出来ました。 サーバーから取得したデータがリストボックスにに表示されると思います。 この時注意して欲しいのが、リストボックスのコントロールプロパティでSortをFALSEにしないと、SQLクエリで定義した列順と 変わってしまって紛らわしいので、必ずFALSEにしておきましょう。
また、ファイアウォールの設定では妨害される事があるので、通信する間だけファイアウォールを 切っておくと良いと思います。

いかかだったでしょうか? 個人的には、ODBCで通信するより手続きが少なく、コード量が少なくて助かったなぁ、という印象です。
ただ、この辺の詳しい情報がネットで少なくて、最終的にはマイクロソフトの、ナレッジベースみたいな所でサンプルを入手して ようやく通信が出来た所でした。 (また加えてそのページの日本語が機械翻訳みたいで文書がおかしく理解に苦労しました)

本ページが少しでも参考になれば幸いです。

スポンサードリンク

© chosyoshinsya 2015~2019 All Rights Reserved.

tyosyoshinsy