Cからmdbにアクセスする方法 – プログラミング – Home

Cからmdbにアクセスする方法
 
通知
すべてクリア

[解決済] Cからmdbにアクセスする方法


ちかりん
 ちかりん
(@ちかりん)
ゲスト
結合: 22年前
投稿: 4
Topic starter  

まだまだ初心者です。質問させてください。

C++ではなくC言語で記述しています。
mdbからレコードを拾ってくる方法がよくわからず困っています。
MSDNや掲示板をちらちら見たところ、C++でのサンプルは見かけたのですが・・・。
(調べ方が甘いのかもしれません)

まず知りたいのは、
1.必要なインクルードや宣言
2.mdbのopenの仕方

このへんの取っ掛かりがわかれば自力で進めると思うので
ご存知の方、よろしくお願いします。

環境はwindows2000、Microsoft Visual C++6.0です。


引用未解決
トピックタグ
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

ODBCを使うならこの辺り:
http://msdn.microsoft.com/library/en-us/odbc/htm/sqlapi.asp

DAOを使う場合はこの辺り:
http://www.microsoft.com/japan/developer/library/dao360/dahowdataaccessoverview
.htm
DAOはCOMコンポーネントなので、VBでもCでも扱いは同じです。
VB向けの説明を読み替える必要があります。

使ったことはありませんが、
Active Data Objects (ADO) というのもあります。

これだけでは、DBを開く取っ掛かりにもならないと思いますが、
どのAPIを使うのかが不明なので、このくらいで。


返信引用
ちかりん
 ちかりん
(@ちかりん)
ゲスト
結合: 22年前
投稿: 4
Topic starter  

dairygoods さん、早速のresありがとうございます。

私はCはかじっていましたが、C++はまだ使ったことがありません。
VBもそれほど数をこなしていません。

APIはCAD系のカスタムのAPIを使ってます。実行ファイルはdllが作成されます。
(うまく説明できません・・・すみません。)

DAOを使いたいのですが、「DAOを使う場合はこの辺り」の
サイトがみつからないというメッセージが出てきてしまいました。
お手数ですが、もう一度参照可能なサイトを教えていただけませんか?


返信引用
島
 島
(@島)
ゲスト
結合: 23年前
投稿: 238
 

>DAOを使いたいのですが、「DAOを使う場合はこの辺り」の
>サイトがみつからないというメッセージが出てきてしまいました。

ちかりんさん、URL を示す下線が .htm 以前までしか無いので、リンクが不完全なのです
マウスでクリックするのではなく、URL を範囲指定でコピーして、ビューワーが IE なら
アドレスにペーストして見に行ってください


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

> DAOを使いたいのですが、「DAOを使う場合はこの辺り」の
> サイトがみつからないというメッセージが出てきてしまいました。

URLが改行されてしまっているので、つなげてみてください。

C言語からCOMを使ったことは無いのですが、
C:\Program Files\Common Files\Microsoft Shared\DAO\dao360.dll
にタイプライブラリがありますので、
これからC言語用のヘッダーを生成できるはずです。

ところで、「C言語で書かなければならない」という状況でないのならば、
C++やMFCを使ったほうが簡単ですので、そちらをお勧めします。


返信引用
渋木宏明(ひどり)
 渋木宏明(ひどり)
(@渋木宏明(ひどり))
ゲスト
結合: 23年前
投稿: 196
 

>C言語からCOMを使ったことは無いのですが、
>C:\Program Files\Common Files\Microsoft Shared\DAO\dao360.dll
>にタイプライブラリがありますので、
>これからC言語用のヘッダーを生成できるはずです。

ほんとに?

そもそも COM のインターフェース自体、VC++ では純粋仮想クラスとして表現されるも
のなので、C 言語仕様内で扱うのは困難だと思うんですが。。。

コンパイラとして VC++ を使っているなら、C++ 言語で記述された「関数」程度なら C
言語でも比較的容易に扱えますが、クラスを扱うのはかなり苦労します。

純粋に C 言語レベルでデータベースを扱うとすると、(あれば)DB毎に用意されたラ
イブラリを使うか、ODBC を使う以外に方法は無いと思います。

ODBC なら、unix 系 OS からでも利用が可能なようですから、普段そういう低位の API
に慣れ親しんでいる人なら特に問題なく使いこなせると思います。


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

> そもそも COM のインターフェース自体、VC++ では純粋仮想クラスとして
> 表現されるも
> のなので、C 言語仕様内で扱うのは困難だと思うんですが。。。

純粋仮想クラスはC言語から見ると、
関数ポインタの一覧をメンバーに持つ構造体です。

MIDLが生成するインターフェイスヘッダーファイルを見てみると、
次のような感じでCとC++用のインターフェイスが定義されているの
が分かると思います。

#if defined(__cplusplus)

class IText {
public:
virtual HRESULT FuncA() = 0;
virtual HRESULT FuncB(int arg) = 0;
};

#else

struct ITestVtbl {
HRESULT (*FuncA)(ITest* pThig);
HRESULT (*FuncB)(ITest* pThig, int arg);
};
struct ITest {
struct ITestVtbl* lpVtbl;
};

#endif

C言語でCOMインターフェイスを呼び出す場合、次の形式になります。

ITest* pText;
pText->lpVtbl->FuncA(pText);


返信引用
渋木宏明(ひどり)
 渋木宏明(ひどり)
(@渋木宏明(ひどり))
ゲスト
結合: 23年前
投稿: 196
 

>MIDLが生成するインターフェイスヘッダーファイルを見てみると、
>次のような感じでCとC++用のインターフェイスが定義されているの
>が分かると思います。

あれ? デフォルトでこんなの吐いてくれてましたっけ?
知らなかったです。。。 m(_ _)m

# けど、今更自分で AddRef(), Release() するのはイヤだな (^^;


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

> # けど、今更自分で AddRef(), Release() するのはイヤだな (^^;

そうですね。
MFCはともかく、C++を使って良いなら、
COMの部分だけでもC++を使ったほうがいいと思います>ちかりん 様
#importするだけで使えるし。


返信引用
ちかりん
 ちかりん
(@ちかりん)
ゲスト
結合: 22年前
投稿: 4
Topic starter  

C++を使ってみようと思います。
MFCじゃなくてもいいんですよね?

→#importするだけで使えるし。
dairygoods さん、
MSDNを見てみましたがよくわからないので、
どうか一部分だけでも具体例を見せていただけませんか?


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

1)アプリケーションの開始時にCOMを初期化します
CoInitialize();

2)cppファイルでタイプライブラリをインポート
// EOFが名前衝突してしまうのでrenameします
#import ~\dao360.dll rename(EOF, DAOEOF)

3)DBアクセスするソース
using namespace DAO;

void function() {
_DBEnginePtr dbEngine;
HRESULT hr = dbEngine.CreateInstance(DAO.DBEngine.36);

DatabasePtr database =
dbEngine->OpenDatabase(_bstr_t(test.mdb));

// レコード処理
RecordsetPtr recordset = ...;

database->Close();
}

4)アプリケーションの終了時にCOMを片付けます
CoUninitialize();

一度コンパイルすると、dao360.tlhというヘッダーファイルができます。
その中に全ての定義がありますので、それを参照してください。
(VCプロジェクトに追加すればクラスビューでも参照できます)
VBでの例なら結構見つかるはずです。
あとは、DAOオブジェクトの解説と照らし合わせて類推して下さい。


返信引用
ちかりん
 ちかりん
(@ちかりん)
ゲスト
結合: 22年前
投稿: 4
Topic starter  

dairygoods さん、ありがとうございます。
なんとか進めそうです。
ご意見をくださった皆様、ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました