OleVariant型ポインタからADODataSetへ

解決


GTR  2008-06-10 21:39:32  No: 30972

お世話になります。
教えて頂きたい事があるのですが、
OleVariant型ポインタで指定してあるデータをADODataSetへ
渡す(関連付ける)方法です。
今は
  ADODataSet1 := @OleVarianr1;
  ADODataSet1.First;
  ShowMessage(ADODataSet1.FieldByname('A1').AsString);
としていますがデータが表示されません。
ShowMessageでアドレスエラーになります。
@OleVarianr1にも値が入っているのでデータはあると思うのですが。
解決方法ご存じの方、ご教授お願い致します。


igy  2008-06-10 22:45:32  No: 30973

>OleVariant型ポインタで指定してあるデータ

は、どのような形式でデータが格納されているのですか?


GTR  2008-06-11 00:50:15  No: 30974

データはSQLServer2005からの集計結果です。


igy  2008-06-11 01:44:11  No: 30975

>データはSQLServer2005からの集計結果です。

それは、どのような形式で格納されているのですか?


めじな  2008-06-11 01:59:40  No: 30976

あの・・・まず文法からしておかしい気がするのは私だけでしょうか。。。
「ADODataSet1」の型が不明ですが多分TADODataSetなのでしょう。
アドレスを渡すのですからまずこんな感じにしないとエラーが出ますよね?

var
  ADODataSet1: ^TADODataSet;
begin
  ADODataSet1 := @OleVariant1;
  ADODataSet1^.First;
  ShowMessage(ADODataSet1^.Fields[0].AsString);
end;

OleVariant1がDataSetとして扱えるものである事が前提ですが。


GTR  2008-06-11 02:45:41  No: 30977

igy様
>どのような形式で格納されているのですか?
ExcelのVBScriptのサンプルからなので形式は解りませんが
通常の結果セットだと思います。
---VBScript---
ADODataSet1 = OleVariant1
Sheet1.Cells(cn, 1) = RTrim(ADODataSet1.Fields("DT1"))
Sheet1.Cells(cn, 2) = RTrim(ADODataSet1.Fields("DT2"))
---------------
めじな様
めじな様のサンプルの様にしてみたのですが、今までと同じで
ShowMessageの行でエラーになります。

VBScriptで出来ている様ですので、DELPHIで何とか出来ないもので
しょうか?


めじな  2008-06-11 03:00:46  No: 30978

igyさんもおっしゃっていますがどのような型?形式?かが分からない事には返答が難しいです。
GTRさんの文章では何を使ってどうやって値を取ってきてどのようにOleVariant1に渡したのか想像がつきません。
またエラーメッセージも正確に載せて頂けるとみなさんから返事がつきやすいと思います。


GTR  2008-06-11 03:30:31  No: 30979

めじな様
具体的な事を記入せずすみませんでした。
やっている事は
1.検索条件を指定しCOMサーバーにアクセスします。
    COM1.GetData(Jouken.Recordset,OleVariant1);
2.OleVariant1に結果セットのポインタがセットされます。
3.ADODataSetを使ってデータを取り出そうとしています。
    ADODataSet1 := @OleVariant1
4.ShowMessageでデータが取得出来たか確認しています。
    ShowMessage(ADODataSet1.Fields[0].AsString);
    モジュールXXXXのアドレス004C5F4でアドレス01AC00ADに対する
    読み込み違反がおきました。
    になります。

5.Excelサンプルで表示される項目は7項目で
    数値、文字、数値、数値、数値、数値、数値です。

あまり具体的に書けませんでしたが・・・
COMを作成したところからはExcelのVBScriptのサンプルしか
もらえないので、困っております。
COM,ADODataSetの理解が足りないのですが、
皆様のお力をお貸し下さい。


めじな  2008-06-11 05:01:37  No: 30980

OleVariant1が何か分かりませんがADOのRecordsetだと仮定します。
(多分そうだと思うのですが)
ADODataSet1をVariantで宣言してADOのレコードセットだと明示したらどうでしょうか。

var
  ADODataSet1: Variant;
begin
  ADODataSet1 := CreateOleObject('ADODB.Recordset');

  ADODataSet1.Close;

(テストしている訳ではないのでエラーが出るかもしれません)


GTR  2008-06-11 05:33:50  No: 30981

めじな様
有り難うございます。
例に書いて頂いたコードで実行してうまくいきました。

igy様
お世話になりました。
有り難うございます。


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

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






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