阅读:863回复:1
delphi+mapx4访问oracle[转帖]介绍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. |
|