我知道 该如何设置 active form ,但要在active form 中如何控制xml呢?
比如:1 、在服务器现在一个XML文件a,如何通过active from 显示到客户端
2、如何通过客户端修改该XML文件呢?发现xml文件有错误数据,要进行修改?如何做呢?
比如:1 、在服务器现在一个XML文件a,如何通过active from 显示到客户端
2、如何通过客户端修改该XML文件呢?发现xml文件有错误数据,要进行修改?如何做呢?
解决方案 »
- 一个简单的insert into语句
- 昨天又载了个跟头
- 关于用delphi7开发ePass 1000接口函数的问题
- 谁人帮忙介绍份工作?限苏州市(不含周边县市)
- 关于如何在排序dbgrid是显示升序将序的三角符号
- VC的函数: SMGPAPI_EXPORTS InitAPI(const char *sINIFile)在Delphi里应该怎么样写?
- 下面一段代码不知道那里有问题,请大家帮我看一下,谢谢!
- 已经EOF了,为什么还能取得字段值?
- Format 函数
- 高手请教请教:我也不知怎么说,你看过就知道。 :)
- 不喜欢中国队,但我还为为他加油,因为我是中国人.(100分,中国队我亚洲杯之族结束时结贴,UP有分)
- 使用shelltreeview出错(在线等待)
我做的一个DLL的代码(部分):
function TASPCOMa.CreateXML(const SqlStr, xmlFileName: WideString): SYSINT;
var
XmlADOQuery: TADOQuery;
EditXMLDoc: TXmlHelper; //TXmlHelper对象
ElementNode: IXMLNode; //s:ElementType的节点
FirstNode, ADDNode, ScheamNode: IXMLNode;
TableName: WideString;//数据表名
PrimKeySQL, AllFieldName: String; //主键字段
FieldName, FieldDataType: String; //字段名, 字段类型
i, fieldNum, jqka: Integer;//字段个数(s:ElementType的节点)
begin
If UpperCase(Copy(Trim(SQLStr),1,6)) <> 'SELECT' Then
begin
Result := -1; //SQL语句非法
Exit;
end;
If UpperCase(Copy(Trim(xmlFileName),Length(Trim(xmlFileName))-2,3)) <> 'XML' Then
begin
Result := -2; //形成的XML文件的文件名非法
Exit;
end; Try
//创建对象
XmlADOQuery := TADOQuery.Create(nil); XmlADOQuery.Connection := ADOConn;
XmlADOQuery.SQL.Clear;
XmlADOQuery.SQL.Add(SqlStr);
try
XmlADOQuery.Active := True;
except
Result := -200; //执行sql语句出错
exit;
end;
try
XmlADOQuery.SaveToFile(xmlFileName,pfXML);
except
Result := -300; //保存文件出错
exit;
end;
XmlADOQuery.Active := False; //创建TXmlHelper对象
EditXMLDoc := TXmlHelper.Create;
//载入文件
if EditXMLDoc.LoadXML(xmlFileName,FromLocalFile) = false then
begin
Result := -400; //打开XML文件出错
exit;
end
else
begin
FirstNode := EditXMLDoc.RootNode; //数据表名rs:basetable
TableName := FirstNode.ChildNodes.Nodes['s:Schema'].ChildNodes.Nodes['s:ElementType'].ChildNodes.Nodes['s:AttributeType'].Attributes['rs:basetable'];
fieldNum := FirstNode.ChildNodes.Nodes['s:Schema'].ChildNodes.Nodes['s:ElementType'].ChildNodes.Count;
//主键字段
PrimKeySQL := '';
AllFieldName := ''; //添加根节点的节点,记录字段类型
for i := 0 to fieldNum - 2 do
begin
ElementNode := FirstNode.ChildNodes.Nodes['s:Schema'].ChildNodes.Nodes['s:ElementType'].ChildNodes.Nodes[i];
FieldName := ElementNode.Attributes['name'];
//自动增长字段不处理
//If not (ElementNode.Attributes['rs:autoincrement']='true') Then
If ElementNode.Attributes['rs:autoincrement'] = Null Then
begin
If Length(AllFieldName) = 0 Then
AllFieldName := AllFieldName + FieldName
Else
AllFieldName := AllFieldName + '|' + FieldName;
FieldDataType := ElementNode.ChildNodes.Nodes['s:datatype'].Attributes['dt:type'];
//添加节点
ADDNode := EditXMLDoc.CreateNodeElement(FirstNode.ChildNodes.Nodes['s:Schema'],FieldName,Decrypt(FieldDataType));
//取主键字段名
If (ElementNode.Attributes['rs:keycolumn']='true') Then
If Length(PrimKeySQL) = 0 Then
PrimKeySQL := PrimKeySQL + FieldName
Else
PrimKeySQL := PrimKeySQL + '|' + FieldName;
end;
end; //添加节点
ADDNode := EditXMLDoc.CreateNodeElement(FirstNode.ChildNodes.Nodes['s:Schema'], 'AllFieldName',Decrypt(AllFieldName));
ADDNode := EditXMLDoc.CreateNodeElement(FirstNode.ChildNodes.Nodes['s:Schema'], 'PrimKey',Decrypt(PrimKeySQL));
ADDNode := EditXMLDoc.CreateNodeElement(FirstNode.ChildNodes.Nodes['s:Schema'], 'TableName',Decrypt(TableName));
//function TXmlHelper.DeleteNodeElement(targetNode: IXmlNode): Boolean;
//删除 s:ElementType 节点
ScheamNode := FirstNode.ChildNodes.Nodes['s:Schema'].ChildNodes.Nodes['s:ElementType']; if EditXMLDoc.DeleteNodeElement(ScheamNode) = true then
EditXMLDoc.SaveToFile(xmlFileName)
else
begin
XmlADOQuery.Free; //释放对象
EditXMLDoc.Free;
//删除文件
if FileExists(xmlFileName) then
DeleteFile(xmlFileName); result := -500; //XML文件增删节点错误
exit;
end;
end; result := 1;
Except result := 0;
End;
//释放对象
If EditXMLDoc <> nil Then
EditXMLDoc.Free;
If XmlADOQuery <> nil Then
XmlADOQuery.Free;
end;
InSertTemp: WideString): SYSINT;
var
useDataFileName: string;
ArrayDataFileName: Array of String;
XmlADOQuery: TADOQuery;
AXXMLdoc: TXmlHelper;//TXmlHelper对象
TableName, AllFieldName, PrimKey: WideString;//数据表名,全部字段名,主键字段名
FirstNode: IXmlNode;
DataNode, rsDataNode: IXmlNode;//影射文件节点、数据文件节点 fieldNum: Integer;//字段个数(s:ElementType的节点) fieldArray: Array of String; //字段名数组
sqlKeyArray: Array of String; //主键字段数据
ElementNode: IXMLNode; //s:ElementType的节点
i, j, k, iFile: integer; //循环变量 InSertSQL, ValuesSQL, DeleteSQL: string;
InSertSQL_Len, ValuesSQL_Len, DeleteSQL_Len: integer;
UpValue, SchemaNodeValue: String;
begin
Try
//创建TXmlHelper对象
AXXMLdoc := TXmlHelper.Create;
//创建对象
XmlADOQuery := TADOQuery.Create(nil); XmlADOQuery.Connection := ADOConn; useDataFileName := DataFileName;
while pos('*',useDataFileName) > 0 do
begin
i := Length(ArrayDataFileName);
SetLength(ArrayDataFileName,i+1);
ArrayDataFileName[i] := copy(useDataFileName,1,pos('*',useDataFileName));
ArrayDataFileName[i] := copy(ArrayDataFileName[i],1,length(ArrayDataFileName[i])-1);
useDataFileName := copy(useDataFileName,pos('*',useDataFileName)+1,Length(useDataFileName)-pos('*',useDataFileName)+1);
end;
i := Length(ArrayDataFileName);
SetLength(ArrayDataFileName,i+1);
ArrayDataFileName[i] := useDataFileName; for iFile := 0 to Length(ArrayDataFileName) - 1 do
begin
//载入文件
try
AXXMLdoc.LoadXML(ArrayDataFileName[iFile],FromLocalFile);
except
CommitFlag := 0; Result := -600; //打开XML文件出错
exit;
end; FirstNode := AXXMLdoc.RootNode;
//数据表名rs:basetable //字符串转换、解密
If InSertTemp = 'Temp' Then
TableName := Encrypt(Decode(FirstNode.ChildNodes.Nodes['s:Schema'].ChildNodes.Nodes['s:TableName'].NodeValue)) + 'temp'
Else
TableName := Encrypt(Decode(FirstNode.ChildNodes.Nodes['s:Schema'].ChildNodes.Nodes['s:TableName'].NodeValue));
AllFieldName := Encrypt(Decode(FirstNode.ChildNodes.Nodes['s:Schema'].ChildNodes.Nodes['s:AllFieldName'].NodeValue));
fieldArray := nil;
while pos('|',AllFieldName) > 0 do
begin
i := Length(fieldArray);
SetLength(fieldArray,i+1);
fieldArray[i] := copy(AllFieldName,1,pos('|',AllFieldName));
fieldArray[i] := copy(fieldArray[i],1,length(fieldArray[i])-1);
AllFieldName := copy(AllFieldName,pos('|',AllFieldName)+1,Length(AllFieldName)-pos('|',AllFieldName)+1);
end;
i := Length(fieldArray);
SetLength(fieldArray,i+1);
fieldArray[i] := AllFieldName;
if FirstNode.ChildNodes.Nodes['s:Schema'].ChildNodes.Nodes['s:PrimKey'].NodeValue <> null then
begin
PrimKey := Encrypt(Decode(FirstNode.ChildNodes.Nodes['s:Schema'].ChildNodes.Nodes['s:PrimKey'].NodeValue));
sqlKeyArray := nil;
while pos('|',PrimKey) > 0 do
begin
i := Length(sqlKeyArray);
SetLength(sqlKeyArray,i+1);
sqlKeyArray[i] := copy(PrimKey,1,pos('|',PrimKey));
sqlKeyArray[i] := copy(sqlKeyArray[i],1,length(sqlKeyArray[i])-1);
PrimKey := copy(PrimKey,pos('|',PrimKey)+1,Length(PrimKey)-pos('|',PrimKey)+1);
end;
i := Length(sqlKeyArray);
SetLength(sqlKeyArray,i+1);
sqlKeyArray[i] := PrimKey;
end;
fieldNum := FirstNode.ChildNodes.Nodes['s:Schema'].ChildNodes.Count; for j:=0 to DataNode.ChildNodes.Count - 1 do
begin
//SQL语句初始化
InSertSQL := 'insert into ' + TableName + '(';
ValuesSQL := ' values(';
DeleteSQL := 'delete from ' + TableName + ' where ';
InSertSQL_Len := Length(InSertSQL);
ValuesSQL_Len := Length(ValuesSQL);
DeleteSQL_Len := Length(DeleteSQL); rsDataNode := DataNode.ChildNodes.Nodes[j]; for i:=0 to fieldNum - 4 do
begin
UpValue := Decode(AXXMLdoc.GetAttributeValue(rsDataNode,fieldArray[i])); if UpValue <> '' then
begin
SchemaNodeValue := Encrypt(Decode(FirstNode.ChildNodes.Nodes['s:Schema'].ChildNodes.Nodes['s:'+fieldArray[i]].NodeValue));
//判断字段类型
if SchemaNodeValue = 'dateTime' then
//'2003-10-31T16:46:03.530000000',2004-01-17T09:13:10.620000000
UpValue := chr(39) + StringReplace(Copy(UpValue,1,23), 'T', ' ', [rfReplaceAll]) + chr(39)
else if (SchemaNodeValue = 'boolean') And (UpValue = 'True') then
UpValue := '1'
else if (SchemaNodeValue = 'boolean') And (UpValue = 'False') then
UpValue := '0'
else if (SchemaNodeValue='bin.hex') or (SchemaNodeValue='string') then
UpValue := chr(39) + UpValue + chr(39)
else
UpValue := UpValue;
//else if (SchemaNodeValue='i8') or (SchemaNodeValue='number') or (SchemaNodeValue='float')
//or (SchemaNodeValue='int') or (SchemaNodeValue='r4') or (SchemaNodeValue='i2') or or (SchemaNodeValue='ui1') then
If Length(InSertSQL) = InSertSQL_Len Then
InSertSQL := InSertSQL + fieldArray[i]
Else
InSertSQL := InSertSQL + ',' + fieldArray[i];
If Length(ValuesSQL) = ValuesSQL_Len Then
ValuesSQL := ValuesSQL + UpValue
Else
ValuesSQL := ValuesSQL + ',' + UpValue;
//删除主键相同的语句
if Length(sqlKeyArray) > 0 then
for k := 0 to Length(sqlKeyArray) - 1 do
begin
If sqlKeyArray[k] = fieldArray[i] then
If Length(DeleteSQL) = DeleteSQL_Len Then
DeleteSQL := DeleteSQL + fieldArray[i] + '=' + UpValue
Else
DeleteSQL := DeleteSQL + ' and ' + fieldArray[i] + '=' + UpValue;
end;
end //if UpValue <> ''
//********************************************************//
//***处理数据表中允许空的字段,这里把原来的NULL值赋值***//
//***dateTime:900-01-01 00:00:00
//***boolean:0
//***
else
begin
SchemaNodeValue := Encrypt(Decode(FirstNode.ChildNodes.Nodes['s:Schema'].ChildNodes.Nodes['s:'+fieldArray[i]].NodeValue));
//判断字段类型
if SchemaNodeValue = 'dateTime' then
UpValue := chr(39) + '1900-01-01 00:00:00' + chr(39)
else if (SchemaNodeValue = 'boolean') then
UpValue := '0'
else
UpValue := UpValue;
If Length(InSertSQL) = InSertSQL_Len Then
InSertSQL := InSertSQL + fieldArray[i]
Else
InSertSQL := InSertSQL + ',' + fieldArray[i];
If Length(ValuesSQL) = ValuesSQL_Len Then
ValuesSQL := ValuesSQL + UpValue
Else
ValuesSQL := ValuesSQL + ',' + UpValue;
//删除主键相同的语句
if Length(sqlKeyArray) > 0 then
for k := 0 to Length(sqlKeyArray) - 1 do
begin
If sqlKeyArray[k] = fieldArray[i] then
If Length(DeleteSQL) = DeleteSQL_Len Then
DeleteSQL := DeleteSQL + fieldArray[i] + '=' + UpValue
Else
DeleteSQL := DeleteSQL + ' and ' + fieldArray[i] + '=' + UpValue;
end;
end; //if UpValue <> '' else
end; //for i:=0 to fieldNum - 4 do
//删除主键相同的数据
if DeleteSQL_Len <> Length(DeleteSQL) Then
begin
XmlADOQuery.SQL.Clear;
XmlADOQuery.SQL.Add(DeleteSQL);
try
XmlADOQuery.ExecSQL;
except
CommitFlag := 0;
Result := -650;
exit;
end;
end;
//数据处理--把数据插入目标数据表中
InSertSQL := InSertSQL + ')' + ValuesSQL + ')';
XmlADOQuery.SQL.Clear;
XmlADOQuery.SQL.Add(InSertSQL);
try
XmlADOQuery.ExecSQL;
except
CommitFlag := 0;
Result := -700;
exit;
end;
end;//for j:=0 to DataNode.ChildNodes.Count - 1 do
end;//for iFile := 0 to Length(ArrayDataFileName) - 1 do If ADOConn.Errors.Count <> 0 Then
begin
CommitFlag := 0;
Result := -1;
exit;
end; Result := 1;
Except
CommitFlag := 0; Result := 0;
End; //释放对象
If AXXMLdoc <> nil Then
AXXMLdoc.Free;
If XmlADOQuery <> nil Then
XmlADOQuery.Free;
end;
begin
with ClientDataSet1 do
begin
FileName := 'C:\...\exp1.xml';
Open;
Append;
FieldValues['ID'] := Edit1.Text;
{...}
Post;
end;
end;(注:用TClientDataSet控件、試試能不能打開现成的xml文件)