初めまして、最近MFCを勉強し始めたばかりの初心者ですが、
分からないことがあり質問させて頂きました。
質問内容はというと、あまりにも初心者過ぎて聞くのも恥ずかしいですが、
現在、MFCを使いODBC接続で、SQLサーバーにつなごうとしていますが、
CRecordsetの派生クラスを作り、実際のソースでクラスを呼び出そうとしても、
静的でないメンバ関数の中で呼び出しが正しくありません。
とエラーが出て使うことができません。
下記にソースを書いておきますので、よろしければご教授よろしくお願いいたします。
実行環境 Windows XP
Visual C++6.0
SQL文発行のテーブル等ついては一部省略させて頂いております。
/*******************************************/
// 各レコードのオープンクローズクラス //
// 指定したレコードのオープンとクローズを行う //
/****************************************/
class Dbo {
private :
CRecordset rs;
public :
BOOL dbo_Open( CString &GetSqlScript );
BOOL dbo_Close();
};
/****************************************/
// レコードのオープン処理メソッド //
// レコードのオープンを行う //
/****************************************/
BOOL Dbo::dbo_Open( CString &GetSqlScript ) {
try {
rs.Open( CRecordset::dynaset, GetSqlScript, CRecordset::none );
}
catch( _com_error &e ){
// データ操作失敗
AfxMessageBox( e.Description() );
return FALSE;
}
return TRUE;
}
/****************************************//
// sqlを発行しレコードの降順を行う //
/*******************************************//
void Sort() {
CString sqlsort;
sqlsort = select ;
sqlsort += from ;
sqlsort += ORDER BY desc;
Dbo::dbo_Open(sqlsort);
}
的外れでしたらすいません
CRecordsetの派生クラスになってないよな。。。
後、Dboクラスのインスタンスを作成していませんが
この後どうやってdbo_Closeさせるつもりでしょうか
と、すいません 大事な質問に対して答えてなかったです。
エラーの内容についてはそのままで、dbo_Openがstatic関数じゃないよ?と
言っているのでエラーを回避するにはdbo_Openをstatic関数にする必要があります。
ただ、メンバ変数にCRecordsetを持ち同じクラス内にdbo_Closeを用意している
ようなので、Dboクラスのインスタンスを作成しそのメンバにたいして
アクセスする書き方をすればよいのではないでしょうか?
>Dbo::dbo_Open(sqlsort);
を
Dbo m_Dbo;
m_Dbo.dbo_Open(sqlsort);
とすれば、いいんですよね。
うーむ、MFCの問題と言うよりもC++言語レベルの問題な気がしますね。
static関数で無い関数をクラス外から呼び出すのにインスタンス無しで
呼び出す事はできません。これは別にMFCがどうこうと言う問題でありません。
C++言語の知識が無いのであれば、MFCの使い方を勉強する前に
C++言語の勉強をしないとたぶん難しいと思います。
MFCはC++言語の知識がきちんとある事が前提になります。
同時に勉強できないとは言いませんが、茨の道だと思いますよ。