打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
通过CrossTalk在Delphi中使用ADO.Net(1)

atozed这个公司,做了个新项目(indy也是他们搞的),企图在Native与.Net中架起一个桥梁,让Delphi可以使用.Net的元件,地址在:

http://www.atozed.com/CrossTalk/index.EN.aspx

因为ADO2.8后,MS不再维护了,全部转到了ADO.Net,我也一直想使用其新的功能,但是项目一直还是抛不掉Delphi环境,这个CrossTalk看起来是我想要的。

下载后,开启Delphi XE,新建一个专案,保存,汇入System.Data.dll里面的如下一些元件:

按“Save”后,它在专案目录下,自动生成了CTSystem_Data.pas文件。

赶紧写段代码来测试一下:

  1. uses    
  2.   Windows, Messages, SysUtils, Variants, Classes, Graphics,   
  3.   Controls, Forms,  Dialogs,StdCtrls, DB, ADODB, CTmscorlib,CTSystem_Data;  
  4. procedure TForm4.Button1Click(Sender: TObject);  
  5. var  
  6.   vConnection:CTSystem_Data.SqlConnection;  
  7.   vCommand:SQLCommand;  
  8.   vReader:SqlDataReader;  
  9.   vTable:CTSystem_Data.DataTable;  
  10.   vDataSet:DataSet;  
  11.   vAdapter:CTSystem_Data.SqlDataAdapter;  
  12.   vFormatter:BinaryFormatter;  
  13. begin  
  14.   vConnection:=SqlConnection.Create('Password=xxx;User ID=sa;Initial Catalog=xxx;Data Source=.');  
  15.   vConnection.Open;  
  16.   vCommand:=vConnection.CreateCommand;  
  17.   vCommand.CommandText:='select UserOID,UserAID from Users';  
  18.   vReader:=vCommand.ExecuteReader;  
  19.   vReader.Read;  
  20.   ShowMessage(vReader.GetString(1));  

哈哈,成功。

目前发现两个问题:

(1)、很多同名函数,即使加上overload也编译不过。如:

  1. function CreateCommand: CTSystem_Data.SqlCommand; overload;  
  2. function CreateCommand: TCTObject {Class: System.Data.Common.DbCommand}; overload;  

但是到c#中查看SqlConnection的定义,里面并没有两个CreateCommand,而是有一个叫CreateDbCommand的:

  1. public SqlCommand CreateCommand();  
  2. protected override DbCommand CreateDbCommand();  

但因为SqlConnection是从DbConnection继承来的,而DbConnection确实有个DbCommand CreateDbCommand();所以,看起来是自动生成的元件把祖先的方法也放到了自己这里,可能是CrossTalk自动生成代码部分的bug,或者是其功能的局限性,因为包裹元件都是从TCTObject继承,包裹元件之间没有继承关系。

(2)、因为所有的.Net元件都被包裹成TCTObject的后代,会破坏原来元件之间的父子关系。如:

  1. Stream = class(TCTObject)  
  2. ...  
  3. end;  
  4. FileStream = class(TCTObject)  
  5. ...  
  6. end;  
  7. BinaryFormatter = class(TCTObject)  
  8. public  
  9.     procedure Serialize(const aSerializationStream: CTmscorlib.Stream; const aGraph: TCTObject); overload;  
  10. ...  
  11. end;  

下面的代码,vFormatter.Serialize调用的地方编译不过:

  1. procedure TForm4.Button1Click(Sender: TObject);  
  2. var  
  3.   vConnection:CTSystem_Data.SqlConnection;  
  4.   vCommand:SQLCommand;  
  5.   vReader:SqlDataReader;  
  6.   vTable:CTSystem_Data.DataTable;  
  7.   vDataSet:DataSet;  
  8.   vAdapter:CTSystem_Data.SqlDataAdapter;  
  9.   vFormatter:BinaryFormatter;  
  10.   vStream:FileStream;  
  11. begin  
  12.   vConnection:=SqlConnection.Create('Password=xxx;User ID=sa;Initial Catalog=xxx;Data Source=.');  
  13.   vConnection.Open;  
  14.   vAdapter:=SqlDataAdapter.Create('select UserOID,UserAID from Users',vConnection);  
  15.   vDataSet:=DataSet.Create();  
  16.   vAdapter.Fill(vDataSet);  
  17.   ShowMessage(InttoStr(vDataSet.Tables.Count));  
  18.   ShowMessage(vDataSet.Tables.Item[0].TableName);  
  19.   vFormatter:=BinaryFormatter.Create();  
  20.   vStream:=FileStream.Create('D:\ADO.Net.dat',FileMode.CreateNew);  
  21.   vFormatter.Serialize(vStream,vDataSet.Tables.Item[0]);  
  22.   vStream.Position:=0;  
  23.   vStream.Flush;  
  24. end;  

[DCC Error] Unit4.pas(53): E2250 There is no overloaded version of 'Serialize' that can be called with these arguments
把定义改为FileStream = class(Stream),编译过了,但执行到这句:
vDataSet.Tables.Item[0].TableName
出现这个错误:
Project Project6.exe raised exception class ECTdotNETException with message 'AmbiguousMatchException : 发现不明确的匹配。'.

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
How can use Ado. Net from Delphi Win32
ADO.Net
Delphi7+SqlServer2000开发中小型MIS系统,用BDE好还是用ADO好?
6.2.1 ADO.NET是什么
C#提高知识 ADO.NET实体数据模型(1)
vb.net2005中什么类型的变量与Delphi的StringList是相似的
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服