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文件。
赶紧写段代码来测试一下:
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics,
- Controls, Forms, Dialogs,StdCtrls, DB, ADODB, CTmscorlib,CTSystem_Data;
- procedure TForm4.Button1Click(Sender: TObject);
- var
- vConnection:CTSystem_Data.SqlConnection;
- vCommand:SQLCommand;
- vReader:SqlDataReader;
- vTable:CTSystem_Data.DataTable;
- vDataSet:DataSet;
- vAdapter:CTSystem_Data.SqlDataAdapter;
- vFormatter:BinaryFormatter;
- begin
- vConnection:=SqlConnection.Create('Password=xxx;User ID=sa;Initial Catalog=xxx;Data Source=.');
- vConnection.Open;
- vCommand:=vConnection.CreateCommand;
- vCommand.CommandText:='select UserOID,UserAID from Users';
- vReader:=vCommand.ExecuteReader;
- vReader.Read;
- ShowMessage(vReader.GetString(1));
哈哈,成功。
目前发现两个问题:
(1)、很多同名函数,即使加上overload也编译不过。如:
- function CreateCommand: CTSystem_Data.SqlCommand; overload;
- function CreateCommand: TCTObject ; overload;
但是到c#中查看SqlConnection的定义,里面并没有两个CreateCommand,而是有一个叫CreateDbCommand的:
- public SqlCommand CreateCommand();
- protected override DbCommand CreateDbCommand();
但因为SqlConnection是从DbConnection继承来的,而DbConnection确实有个DbCommand CreateDbCommand();所以,看起来是自动生成的元件把祖先的方法也放到了自己这里,可能是CrossTalk自动生成代码部分的bug,或者是其功能的局限性,因为包裹元件都是从TCTObject继承,包裹元件之间没有继承关系。
(2)、因为所有的.Net元件都被包裹成TCTObject的后代,会破坏原来元件之间的父子关系。如:
- Stream = class(TCTObject)
- ...
- end;
- FileStream = class(TCTObject)
- ...
- end;
- BinaryFormatter = class(TCTObject)
- public
- procedure Serialize(const aSerializationStream: CTmscorlib.Stream; const aGraph: TCTObject); overload;
- ...
- end;
下面的代码,vFormatter.Serialize调用的地方编译不过:
- procedure TForm4.Button1Click(Sender: TObject);
- var
- vConnection:CTSystem_Data.SqlConnection;
- vCommand:SQLCommand;
- vReader:SqlDataReader;
- vTable:CTSystem_Data.DataTable;
- vDataSet:DataSet;
- vAdapter:CTSystem_Data.SqlDataAdapter;
- vFormatter:BinaryFormatter;
- vStream:FileStream;
- begin
- vConnection:=SqlConnection.Create('Password=xxx;User ID=sa;Initial Catalog=xxx;Data Source=.');
- vConnection.Open;
- vAdapter:=SqlDataAdapter.Create('select UserOID,UserAID from Users',vConnection);
- vDataSet:=DataSet.Create();
- vAdapter.Fill(vDataSet);
- ShowMessage(InttoStr(vDataSet.Tables.Count));
- ShowMessage(vDataSet.Tables.Item[0].TableName);
- vFormatter:=BinaryFormatter.Create();
- vStream:=FileStream.Create('D:\ADO.Net.dat',FileMode.CreateNew);
- vFormatter.Serialize(vStream,vDataSet.Tables.Item[0]);
- vStream.Position:=0;
- vStream.Flush;
- 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 : 发现不明确的匹配。'.
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。