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


麗子  2009-03-09 21:29:36  No: 69801

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


麗子  2009-03-09 22:04:36  No: 69802

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


たぬ  2009-03-09 23:06:16  No: 69803

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-10 02:34:30  No: 69804

たぬ  さん  有難うございます。
両方やってみましたが結果は同じでした。
接続は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-10 04:22:08  No: 69805

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

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

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

#自身は全然ありません


麗子  2009-03-10 05:02:43  No: 69806

たぬ  さん  駄目でした

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

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

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


たぬ  2009-03-10 07:23:47  No: 69807

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

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

これ・・・がないかな?

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


たぬ  2009-03-10 07:27:45  No: 69808

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

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-10 08:15:04  No: 69809

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

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

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

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


たぬ  2009-03-10 08:57:43  No: 69810

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

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

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

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加