峻祁连等大侠请进,关于mapx数据绑定的问题(200分)

  • 主题发起人 主题发起人 阿尔卑斯
  • 开始时间 开始时间

阿尔卑斯

Unregistered / Unconfirmed
GUEST, unregistred user!
你提到绑定ado的方法
procedure TForm1.N30Click(Sender: TObject);
begin

ADOQuery1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:/工程/Delphi编程实践/MapXFengTai/database/ftycdb.mdb;Persist Security Info=False';
ADOQuery1.close;
ADOQuery1.Sql.Clear;
ADOQuery1.SQL.Add('Select * from 片区');
ADOQuery1.open;
ds := map1.datasets.Add(miDataSetADO,ADOQuery1.Recordset,'dsPQ','ph',Emptyparam,'片区图',Emptyparam,true);
end;


这里的datasets.add()方法,你能把里面的参数具体讲一下么?第一个,第二个应该没有问题,
第三个'dsPQ',第四个'ph'是表里面的字段么?必须是索引么?是否要和mapinfo表的id关联,怎么关联?
'片区图'是表名?
能不能把你绑定的表结构讲一下,
我是菜鸟了,如果成功,我送上200分,谢谢了
 
我的完全照抄峻祁连的例子,就是不行,下面是我的例子:
procedure TForm1.Button6Click(Sender: TObject);
var ds :dataset;
Emptyparam:olevariant;

begin

adoquery1.Active :=false;
adoquery1.SQL.Clear;
adoquery1.SQL.Add('select * from 表1');
adoquery1.Open
ds:=map1.datasets.add(midatasetado,adoquery1.Recordset ,'myds','id',Emptyparam,'86年交通调查小区边界',Emptyparam,true);
end;

执行到最后一句出错,出错信息:invalid fields parameter
我的表设计为 id ,道路长度,道路等级
id为索引字段, 86年交通调查小区边界.tab中只有一个id字段
我后来想是不是Emptyparam不要定义的,就把这行去掉,还是最后一句出错,出错信息
layer specified is not matchable
不知道为什么,求教
 
我知道为什么了,我没有给'86年交通调查小区边界.tab'定义索引,所以该图层不可被绑定。
大家不用回答了,省我200分
 
to:
阿尔卑斯
谁说那样不能绑定??
.tab至少要有个字段是索引字段才能绑定
给你个函数
{
功能说明:把ORACLE表绑定在该图层
参数说明:Layer要绑定数据的图层,TableName对应的ORACLE表,Query用的数据集
返回为绑定成功的数据集
}
Function BindOracleDataSet(Map :TMap;Layer:CMapXLayer;
TableName :string;Query :TADOQuery;DoQuery: TADOQuery):CmapxDataset;

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表的字段信息
do
Query.sql.text :=
'Select TABLE_NAME,COLUMN_NAME,DATA_TYPE FROM '
+' user_tab_columns where TABLE_NAME='+#39
+UPPERCASE(TableName)+#39;
try
do
Query.open;
except
exit;
end;

do
Query.First;

//加上字段
Fields := CoFields.Create;
while notdo
Query.Eofdo

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;

do
Query.Next;
end;


try //Uppercase(TableName)+'_ID'
Result :=Map.Datasets.Add(miDataSetADO,Query.Recordset,
Uppercase(Layer.Name),'OBJ_KEYID', EmptyParam,Layer, fields,EmptyParam);
except
exit;
end;

end;

'OBJ_KEYID' 是在.tab的索引字段
 
你问题解决了,很好!
既然你的分已经节省不了了,我也进来看看吧,不要给我分了。
看到有人称我为大侠,受宠若惊,共同进步吧!
 
to:峻祁连大侠
你数据绑定都用miDataSetADO,adoquery1.recordset吗?
如果我想用TClientDataSet怎么样用?Map.Datasets.Add的Type和SourceData
怎么设置,很急,谢谢!
 
to:峻祁连大侠
我现在想用dcom的三层结构,有没有好点的办法呢?
 
三层的我没用过,我们共同研究一下在说吧。
 
峻祁连:我试了,不好搞。
TClientDataSet不行,如果存成.xml的文件不知道可以不可以。
可是数据量大的时候,速度肯定慢
 
要不你用SafeArray试试,把数据组织成一个多维数组
 
好的,我试用用看
 
delphi不支持Ado绑定图层的数据集。用ODBC可以。
 
峻祁连:
自己画的图标,怎么改图上点的位图样式?
好象SymbolBitmapName只认系统目录
C:/Program Files/MapInfo/MapX 5.0/CUSTSYMB
谢谢!
 
Bitmaps := CoBitmapSymbols.Create;
i :=Bitmaps.Count;
为什么i的数值是C:/Program Files/MapInfo/MapX 5.0/CUSTSYMB
下的图标数,能不能把目录改成自己的?
 
后退
顶部