既存のプログラムにデータベースのヘッダーを追加するには


麗子  2009-03-09 12:29:36  No: 69801  IP: [192.*.*.*]

使用環境  VC6.00Pro MFCにて作成
既存のプログラムにSQLServerに接続する必要が出できました。
テストプログラムを作成し(プロジェクト生成時にデータベースのヘッダーをチェック)テスト正常に行えました。
既存のプログラムに反映させようと思ったらデータベースのヘッダーを追加する方法が見当たりません。
手動で行おうと思い、追加されたresource.hとか*.rcに組み込まれていて壊れそうで良くわかりません
宜しくお願いします

編集 削除
麗子  2009-03-09 13:04:36  No: 69802  IP: [192.*.*.*]

ダイアログベースで作成しています。
データベースのヘッダーではなくオートメーションのサポートの追加でした。
オートメーションの追加方法です

編集 削除
たぬ  2009-03-09 14:06:16  No: 69803  IP: [192.*.*.*]

CHogeApp.cppの中の
BOOL CHogeApp::InitInstance()
{
>  if (!AfxOleInit()) {
>      AfxMessageBox("Cannot initialize COM services.");
>      return FALSE;
>  }

を追加でいいはず。


また、CDatabase使うならStdAfx.hに
#include <afxdb.h>
CDaoDatabaseなら
#include <afxdao.h>
を追加です。

編集 削除
麗子  2009-03-09 17:34:30  No: 69804  IP: [192.*.*.*]

たぬ  さん  有難うございます。
両方やってみましたが結果は同じでした。
接続はADOです。

ソースは
  if(!AdoDatabase.Open(_T("Iynluavtzjn9ifg"),_T("sa"),_T("sasasasa"),_T("SQLOLEDB"))){
    AfxMessageBox("SQL-Serverへ接続できませんでした");
    return FALSE;
  }


  if(!rs.Open(strSQL)){
    AfxMessageBox("データが読み出せませんでした");
  }else{
    int item=-1;
    LIST_SAGYO_REC sagyo;
    
    while(!rs.IsEOF())  //レコードが存在する間
    {
      rs.GetFieldValue(0,sagyo.StartTime); //開始日付
      m_ListViewSagyoRec.SetItem(item,1,LVIF_TEXT,sagyo.StartTime,0,0,0,0); //開始日付
      
      rs.MoveNext();  //次のレコードへ
    }
    rs.Close();    //レコードを閉じる
  }

です。
AfxOleInit()) を追加して接続しできました。
エラーはrs.GetFieldValue(0,sagyo.StartTime); で発生しています。

Module
File:i386\chkesp.c
Line 42
This value of ESP was not poperty saved across a functioncall.
This is usually a result of calling a function declared whith one calling comvention 
whith a function pointer declaer whith a defferent calling converter.
(Press Retry or debug the applicatuon.)
です。
何が悪いのですかね?

編集 削除
たぬ  2009-03-09 19:22:08  No: 69805  IP: [192.*.*.*]

ADOのことはあまりよく分かりませんが

>rs.GetFieldValue(0,sagyo.StartTime);
int nIndex = 0;
rs.GetFieldValue(nIndex ,sagyo.StartTime);

または
rs.GetFieldValue("FieldName",sagyo.StartTime);
みたいな方法で回避できませんか?

#自身は全然ありません

編集 削除
麗子  2009-03-09 20:02:43  No: 69806  IP: [192.*.*.*]

たぬ  さん  駄目でした

プロジェクトの生成時にダイアログにてオートメーションをサポートするに
してヘッダーのみにしたらこのソースは旨く動作します。

まだ何か足らないのではないかと思います。

このオートメーションはあとから追加はできないのですかね

編集 削除
たぬ  2009-03-09 22:23:47  No: 69807  IP: [192.*.*.*]

何度も適当な事書いてすみません。
http://www.alpha-net.ne.jp/users2/uk413/vc/VCT_ADO.html
ちょっと試してみました。
このページの通りに実行してみましたがうまく動きました。
ただし相手はAccessです。AfxOleInit()は必要ありませんでした。
何となく比べてみると

// COMの初期化処理
::CoInitialize(NULL);

これ・・・がないかな?

#あまり振り回してしまっても申し訳ないので
#私も調べてみます。

編集 削除
たぬ  2009-03-09 22:27:45  No: 69808  IP: [192.*.*.*]

追記です。フィールドのデータを取得する部分は上のページに加えて

COleVariant var1;
var1.vt = VT_I2;
var1.iVal = 0;
COleVariant value= m_pRecordset->GetFields()->GetItem(var1)->GetValue();
TRACE("%s\n",value.bstrVal);

こんな感じで書いてみました。

#情報がなかなか見つからなくて難しいですね。
#CDatabaseじゃだめですか?

編集 削除
麗子  2009-03-09 23:15:04  No: 69809  IP: [192.*.*.*]

たぬ  さん  有難う御座います。
COMを使用していない為、やりましたがやはり駄目でした。

フィールドのデータを取得方法についてもアクセス方法が異なるので
使えませんでした。

ODBCへの登録を使えればいいのですが処理が遅いので使うなとのユーザーから
の要求です。
もう一度プロジェクトの生成からやり直してコピーしていきます。

本当に有難う御座いました

編集 削除
たぬ  2009-03-09 23:57:43  No: 69810  IP: [192.*.*.*]

了解しました。お役に立てなくて申し訳ありません。

可能であれば、参考にされたHPなど紹介して
頂けないでしょうか?

#今までの情報だと同様の環境が構築できなかったので。

http://www.oracle.com/technology/tech/windows/ole_db/htdocs/Image9.gif
ADOの方が早いと言うのは微妙かと。

編集 削除