通过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文件。

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

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 {Class: System.Data.Common.DbCommand}; 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 : 发现不明确的匹配。'.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

火星牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值