在网上查了查资料,照猫画虎的写了下面的代码:
procedure TForm1.FormCreate(Sender: TObject);
var   conn,rec : variant;
query:ADOquery;
begin
  conn   :=   createoleobject('adodb.connection');
  conn.open('Provider= SQLOLEDB.1;server=ff;database=DBzealot;uid=sa;integrated security=SSPI');
  rec   :=   createOleObject('adodb.recordSet');
  rec.activeconnection:=conn;
  rec.open('select *from tb_Emploee');
end;
end.但是怎么把查询出来的值显示出来?用DBGrid吗?“rec”后面点个“.”但是却没反应,提示“程序有错,不能完成调用”怎么办啊?
最好能写一小段例子,假设tb_Emploee表有2列,“编号”“姓名”。
把表里的数据显示出来,随便什么控件都行。跪求高手帮忙~

解决方案 »

  1.   

    http://www.cnblogs.com/jiangyuxuan/archive/2008/02/09/1066423.html这里有一个,介绍的挺全的
      

  2.   

    rec是variant型,“.”肯定没用
    查询完以后query.first;
    Grid1.rowcount:=query.reccount;
    for i:=1 to query.reccount do
    begin
    Grid1.cells[0,i]:=query.fieldbyname('编号').asstring;
    Grid1.cells[1,i]:=query.fieldbyname('姓名').asstring;
    end;
      

  3.   


    这个我都看8遍了...问题是用conn  :=  createoleobject('adodb.connection'); 和rec  :=  createOleObject('adodb.recordSet'); 创建了对象后,为什么不能调用
    这2个对象的属性和方法呀?先不说别的..
      

  4.   


    是么?可是你的代码中“query”是什么?在哪里声明的?跟我查询出来的记录集rec是怎么连接起来的?是这样吗:“query:=rec;”??
      

  5.   

    那query在哪里声明?是什么类型的?如何与我自己创建的rec  :=  createOleObject('adodb.recordSet')
    “rec”关联起来?
    我初学delphi ,讲详细些好吗...
      

  6.   


    8遍没看懂,那就接着再看,有现成的ado组件为什么不用?
      

  7.   

    我就是想用原生ADO ,有高手能不吝赐教吗?就写一个查询数据,然后填充到控件里的例子就行,分不够我再加,我还有700多分~
      

  8.   

    那不是你问题里给的声明吗?我假设你已经把query建立好,输入了SQL,进行了查询。rec和cnn当然可以调用,但是你得自己找到函数(查msdn),才能调用,不会你一按“.”就自己跑出来。
      

  9.   

    用到了ADODataset控件、DBGrid控件及DataSource控件,不知道是不是你要的。。
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Grids, DBGrids, StdCtrls,ComObj, DB, ADODB;type
      TForm1 = class(TForm)
        Button1: TButton;
        DBGrid1: TDBGrid;
        DataSource1: TDataSource;
        ADODataSet1: TADODataSet;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
    conn,rec : variant;
    rs:_recordSet;
    connstr:string;
    begin
      conn  :=  createoleobject('adodb.connection');
      connstr:='Provider= SQLOLEDB.1;server=.;database=Mq_Mpa;uid=sa;integrated security=SSPI';
      conn.open(connstr);
      showmessage('连接数据库成功');
      rec  :=  createOleObject('adodb.recordSet');
      rec.Source:='select *from admin';
      rec.activeconnection:=conn;
      rec.open;
      rs:=ADODataSet1.Recordset;
      ADODataSet1.ConnectionString:=connstr;
      ADODataSet1.Active:=false;;
      ADODataSet1.CommandText:=rec.Source;
      ADODataSet1.Active:=true;
      ADODataSet1.Open;
      DataSource1.DataSet:=ADODataSet1;
      DBGrid1.DataSource:=DataSource1;
    end;
    end.
      

  10.   

    不好意思,我忘了我声明了query...谢谢各位
      

  11.   


    现在变成这样了,运行以后还是不行procedure TForm1.FormCreate(Sender: TObject);
    var  conn,rec : variant;
         query:ADOquery;       //在这里卡住了(ADOquery或TADOquery都不行)
    begin
      conn  :=  createoleobject('adodb.connection');
      conn.open('Provider= SQLOLEDB.1;server=ff;database=DBzealot;uid=sa;integrated security=SSPI');
      rec  :=  createOleObject('adodb.recordSet');
      rec.activeconnection:=conn;
      rec.open('select *from tb_Emploee');
      query.first;
    Grid1.rowcount:=query.reccount;
    for i:=1 to query.reccount do
    begin
    Grid1.cells[0,i]:=query.fieldbyname('姓名').asstring;//Grid1是StringGrid控件
    Grid1.cells[1,i]:=query.fieldbyname('编号').asstring;
    end;end;
    end.高手们再帮帮我啊~
      

  12.   

    原生 ADO 与 Delphi ADOExpress 组件的对应关系 
    1、Connection <=> ADOConnection.ConnectionObject; 
    2、Recordset <=> ADODataSet.Recordset; 
    3、Command <=> ADOCommand.CommandObject; 
    4、? <=> ADOQuery,因为 ADOQuery 根本就不是原生 ADO 对象 
    5、ExecSQL <=> ADODataSet.Open; 
    6、ExecSQLA <=> ADOCommand.Execute; 
      

  13.   

    原生ADO需要查msdn,我机器慢,英语不好,你去查出来需要的对象和方法特性,然后我写代码。
      

  14.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ADODB, ComObj, ADOInt, DB, Grids, DBGrids;type
      TForm1 = class(TForm)
        DataSource1: TDataSource;
        DBGrid1: TDBGrid;
        ADOQuery1: TADOQuery;
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    var
      conn, rec: variant;
    begin
      conn :=  createoleobject('adodb.connection');
      conn.open('Provider= SQLOLEDB.1;server=ff;database=DBzealot;uid=sa;integrated security=SSPI');
      rec  :=  createOleObject('adodb.recordSet');  //测试环境: d7+sqlserver2000+win2003    by jjwwang  //  注意!!!   这种Open方式是不能连接数据感知控件的!
      {
      rec.activeconnection:=conn;
      rec.open('select * from tb_Emploee');
      //DataSource1.DataSet := nil; 加上下面这句就ERROR  !!!
      }
      //  下面的Open方式就可以了!!!  为什么呢? 原因很简单!
      rec.open('select select * from tb_Emploee', conn, AdOpenStatic, adLockReadOnly, adCmdText);  //要这么转一下.
      adoquery1.Recordset := (IDispatch(TVarData(rec).VDispatch) as _RecordSet);  showmessage(adoquery1.Fields[0].AsString);
    end;
    end.
      

  15.   

    procedure TForm1.FormCreate(Sender: TObject); 
    var 
        i  :integer; 
        conn : string; 
        query:ADOquery;       
    begin 
      conn  := 'Provider= SQLOLEDB.1;server=ff;database=DBzealot;uid=sa;integrated security=SSPI'; 
      query:=TADOQuery.Create(nil);
      query.ConnectionString:=conn;
      with query do
      begin
        Close;
        SQl.Clear;
        sql.Add('select *from tb_Emploee');
        open;
        if RecordCount = 0 then
          grid1.RowCount:=2
        else
          grid1.RowCount:=RecordCount + 1;
        grid1.ColCount:=2;
        for i:=1 to RecordCount do 
        begin 
          Grid1.cells[0,i]:=query.fieldbyname('姓名').asstring;//Grid1是StringGrid控件 
           Grid1.cells[1,i]:=query.fieldbyname('编号').asstring; 
          Next;
        end; 
        Close;
      end; 
      query.free;
    end. 
      

  16.   

    ADOQuery 根本就不是原生 ADO 对象 ,你声明了query就不是原升ADO了
      

  17.   


    谢谢你,能连接上了,不过你的方法好像不是用的原生ADO吧...
    而且query:ADOquery; 这句出错了,换成TADOquery就没事
      

  18.   

    谢谢大哥,能不能不拖控件连接数据库呀?而且也不一定要用数据感知控件,StringGrid也属于数据感知控件吗?
      

  19.   

    终于有人跟俺是想用原生了前段时间俺也有想过用原生,但是感觉在delphi中用原生还是有些怪怪的,现在功力还不够,如果俺功力够的话,
    俺一定要研究他们之间的好处。
      

  20.   

    为什么要用原生呢,除非你自认为比Borland的程序员厉害。Delphi的ADO有没有什么大的毛病。
      

  21.   

      conn :=  createoleobject('adodb.connection');
      conn.open('Provider= SQLOLEDB.1;server=ff;database=DBzealot;uid=sa;integrated security=SSPI');
      rec  :=  createOleObject('adodb.recordSet');
      rec.activeconnection := conn; 
      
      //一定要这么打开,rec.open('select * from tb_Emploee'); 是单向的. 不能for循环了.
      rec.open('select select * from tb_Emploee', conn, AdOpenStatic, adLockReadOnly, adCmdText);   rec.movefirst;  for y:=0 to rec.recordcount-1 do
      begin
        for x:=0 to rec.Fields.Count-1 do
          stringgrid1.Cells[x,y] := vartostr(rec.fields[x].value);
        rec.movenext;
      end;
      

  22.   

    建议用_RecordSet, _Connection, 
    现在这样 编译时不会报错.
      

  23.   

    要显示在DBGrid中就用ADO组件。
      

  24.   

    谢谢各位,我又开了一贴“菜鸟问如何参数化sql”大家再来帮忙啊~