通过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里面的如下一些元件:

通过CrossTalk在Delphi中使用ADO.Net(1)_第1张图片

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

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

[delphi]  view plain copy
  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也编译不过。如:

[delphi]  view plain copy
  1. function CreateCommand: CTSystem_Data.SqlCommand; overload;  
  2. function CreateCommand: TCTObject {Class: System.Data.Common.DbCommand}; overload;  

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

[csharp]  view plain copy
  1. public SqlCommand CreateCommand();  
  2. protected override DbCommand CreateDbCommand();  

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

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

[delphi]  view plain copy
  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调用的地方编译不过:

[delphi]  view plain copy
  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 : 发现不明确的匹配。'.

你可能感兴趣的:(通过CrossTalk在Delphi中使用ADO.Net(1))