1.ADO原生对象在delphi中是什么类型?是_connection,_recordset,_command这种吗?
2.请看下面的代码。(很短的)
procedure TForm1.Button1Click(Sender: TObject);
var
  cn: Variant
  rs: Variant;
  s1: string;
begin
  try
    cn := CreateOLEObject('ADODB.Connection');
    rs := CreateOLEObject('ADODB.Recordset');
    s1 := 'Provider=SQLOLEDB.1;Persist Security Info=True;Initial Catalog=test;Data                Source=localhost;Connect Timeout=5;Use Procedure for Prepare=1';
    cn.Open(s1,'sa','',-1);
    rs.Open('select * from t1',cn,3,1,1);
    adoquery1.Recordset := rs;
  except
  end;
end;
运行出错在“adoquery1.Recordset := rs;”自己也知道类型出错,但这个该如何转换呢?

解决方案 »

  1.   

    感觉你是在写ASP啊,你是不是只要连上数据库就OK了啊?
     try
        if DataModule1.ADOConnection.connected then //操作员登录进行重新连接
          DataModule1.ADOConnection.connected := false;
        DataModule1.ADOConnection.ConnectionString := 'Provider=SQLOLEDB.1;Persist Security info=false;Data Source ='
          + ServerName + ';Initial Catalog = '
          + DataBase + ';User ID = '
          + UserName + ';Password = ' + Password;
        DataModule1.ADOConnection.connected := true;
      except
        on e: exception do
        begin
          IResult := -1;
          GErrMsg := '连接数据库出错!出错信息:' + e.Message;
          writeErrLog(GErrMsg);
          exit;
        end;
      end;
      

  2.   

    adoquery1.Recordset := rs;当然出错误啦,recordSet是delphi封装了原生ADO的,不是原生ADO的recordSet。
      

  3.   


      djhai(左左右右) : 你的方法不行,还是会出错。  qzxyd(只会种菜) : 你说的其实我也知道的。但具体方法呢?如何在两者之间转换?不要告诉我一个字段一个字段的赋过去。  还有,我程序里创建的cn,rs是否是原生ADO对象??? 请熟悉的朋友指点哈。
      

  4.   

    从VARIANT型转成具体接口引用,可以用下面这样adoquery1.Recordset := IUnknown(rs) as _recordset;
      

  5.   

    但注意一点..那样赋值后,adoquery1(或者adodataset)里大多数情况下取不到recordcount值
      

  6.   

    halfdream(哈欠) : 谢谢你的方法。问题解决了。但如果RecordCount这个属性都取不到,那用原生的ado对象不是太麻烦了。另,我的第一个问题也请指点。就是“ADO原生对象在delphi中是什么类型?是_connection,_recordset,_command这种吗?”如果rs不是VARIANT类型,而是,_recordset类型,是否就可以取到RecordCount这样属性了呢?
      

  7.   

    如何取到recordcount值,楼主可以查MSDN或者读TADODATASET的源码.这些原生对象都是COM对象,也是自动化对象..
    从COM知识可以知道,自动化对象可以有两种调用方式..
    一种是"硬"方式的调用,就是指定接口类型的调用.
    另一种是"软"方式调用,就是IDispatch接口提供的,可以用Variant方式调用,也就是类似脚本方式调用.不管哪种调用,调用的都是同样的对象.结果当然一样!!