终极无间
  • 注册日期
  • 发帖数
  • QQ
  • 铜币
  • 威望
  • 贡献值
  • 银元
阅读:863回复:1

delphi+mapx4访问oracle[转帖]

楼主#
更多 发布于:2004-02-15 21:33

介绍delphi+mapx4访问oracle
//oracle中建一个表LINE跟b.tab表结构相同
// id ,name :字符串 ;X,Y :浮点数型
//先用adoconnection连接好数据库,adoquery1指定连接就行,用于查询表数据,不用作其它设置
// adoquery2 作查询表的字段用,也只用指定连接,不需作其它设置
//主要函数:function BindOracleDataSet(Map :TMap;Layer: CMapXLayer; TableName: string;
// Query: TADOQuery;DoQuery: TADOQuery): CmapxDataset;
// 下面有函数具体内容,作者:大富翁 的 zqs10597249
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, OleCtrls, MapXLib_TLB, DB, ADODB, StdCtrls;

type
TForm1 = class(TForm)
Map1: TMap;
ADOQuery1: TADOQuery;
Button1: TButton;
ADOConnection1: TADOConnection;
ADOQuery2: TADOQuery;
Button2: TButton;
Button3: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
lyr :CMapXLayer ;
ds : CMapXDataSet ;
{ Public declarations }
end;

Function BindOracleDataSet(Map :TMap;Layer:CMapXLayer;
TableName :string;Query :TADOQuery;DoQuery: TADOQuery):CmapxDataset;


var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
end;


//.tab至少要有个字段是索引字段才能绑定
//给你个函数
{
功能说明:把ORACLE表绑定在该图层
参数说明:Layer要绑定数据的图层,TableName对应的ORACLE表,Query用的数据集
返回为绑定成功的数据集
}

function BindOracleDataSet(Map :TMap;Layer: CMapXLayer; TableName: string;
Query: TADOQuery;DoQuery: TADOQuery): CmapxDataset;
var
Fields: CMapXFields;
COLUMN_NAMEStr,StrLayer :string;
param, ds: variant;
begin
TVarData(EmptyParam).vType := varError;
TVarData(EmptyParam).vError := longword(DISP_E_PARAMNOTFOUND);

Query.Close;
Query.SQL.Text :='select * from '+UPPERCASE(TableName);
try
Query.Open;
except
end;
//从Oracle得到TableName表的字段信息
DoQuery.sql.text :=
'Select TABLE_NAME,COLUMN_NAME,DATA_TYPE FROM '
+' user_tab_columns where TABLE_NAME='+#39
+UPPERCASE(TableName)+#39;
try
DoQuery.open;
except
exit;
end;
DoQuery.First;

//加上字段
Fields := CoFields.Create;
while not DoQuery.Eof do
begin
//字段名称
COLUMN_NAMEStr :=UPPERCASE(DoQuery.fieldbyname('COLUMN_NAME').asstring);
begin
//字段类型
if UPPERCASE(DoQuery.fieldbyname('DATA_TYPE').asstring)='VARCHAR2' then
Fields.Add(COLUMN_NAMEStr,COLUMN_NAMEStr, miAggregationAuto,0);
if UPPERCASE(DoQuery.fieldbyname('DATA_TYPE').asstring)='NUMBER' then
Fields.Add(COLUMN_NAMEStr,COLUMN_NAMEStr, miAggregationAuto,3);
//日期也要加上
if UPPERCASE(DoQuery.fieldbyname('DATA_TYPE').asstring)='DATE' then
Fields.Add(COLUMN_NAMEStr,COLUMN_NAMEStr, miAggregationAuto,2);
end;
DoQuery.Next;
end;

try //Uppercase(TableName)+'_ID'
// Result :=Map.Datasets.Add(miDataSetADO,Query.Recordset,
//注意add带的第一个参数,MAPX5用midatasetado,MAPX4而用midataado
Result :=Map.Datasets.Add(miDataADO,Query.Recordset,
Uppercase(Layer.Name),'ID', EmptyParam,Layer, fields,EmptyParam);
except
exit;
end;
end;
//'ID' 是在.tab的索引字段


procedure TForm1.Button1Click(Sender: TObject);


begin
lyr := Map1.Layers.Item('b') ;
ds := BindOracleDataSet(Map1 ,lyr , 'LINE', ADOQuery1,ADOQuery2 ) ;


// showmessage(inttostr(ds.RowCount));
// ShowMessage('ok!') ;
end;

procedure TForm1.Button2Click(Sender: TObject);
var

fts : CMapXFeatures ;
ft :CMapXFeature ;
rvs :CMapXRowvalues ;

i, j : integer ;
begin

fts := lyr.AllFeatures ;

for i:= 1 to fts.Count do
begin
ft := fts.Item(i) ;
rvs := ds.Rowvalues[ft] ;
ShowMessage(string(rvs.Item('NAME').value)) ;

end ;
end;

//说明:CMapxBindLayer 的使用本人没研究出来,下面的代码运行时会报错
procedure TForm1.Button3Click(Sender: TObject);
var
BindLayerObject : CMapXBindLayer ;
flds :CMapXFields ;
rs :_RecordSet ;
i :integer ;
begin

//得到数据源
with ADOQuery1 do
begin
ADOQuery1.Close ;
ADOQuery1.SQL.Clear ;
ADOQuery1.SQL.Add('select * from line');
ADOQuery1.Open ;
end ;


rs := ADOQuery1.Recordset ;
rs.MoveLast ;

// showmessage(inttostr(i)) ;
//创建数据列
flds := CoFields.Create ;
flds.Add('ID', 'ID', miAggregationAuto, 0) ;
flds.Add('NAME', 'NAME', miAggregationAuto, 0) ;
flds.Add('X', 'X', miAggregationAuto, 3) ;
flds.Add('Y', 'Y', miAggregationAuto, 3) ;
//创建BinLayer

BindLayerObject := CoBindLayer.Create ;
//BindLayerObject.
// BindLayerObject.LayerName := 'b' ;
BindLayerObject.RefColumn1 := 'X' ;
BindLayerObject.RefColumn2 := 'Y ' ;
BindLayerObject.LayerType := miBindLayerTypeXY ;
ds := Map1.Datasets.Add(miDataADO, rs , 'b', 'X', 'Y',
BindLayerObject, EmptyParam, false )


end;

end.
喜欢0 评分0
游客

返回顶部