碰到个非常棘手的问题,请高手们帮忙!有数据库A、数据库B,各有数据表test,字段名、类型、长度完全一样。
要求把数据库A的test里的数据通过XML文件的方式导入数据库B的test表里,
要考虑主键重复问题。
即:通过SQL语句把符合条件的A.test里的数据写入XML文件,然后通过读取XML文件
的内容把数据导入B.test。哪位高手给点源代码呀。先谢谢了!
可以发到我的信箱里:[email protected]
要求把数据库A的test里的数据通过XML文件的方式导入数据库B的test表里,
要考虑主键重复问题。
即:通过SQL语句把符合条件的A.test里的数据写入XML文件,然后通过读取XML文件
的内容把数据导入B.test。哪位高手给点源代码呀。先谢谢了!
可以发到我的信箱里:[email protected]
我正在写一个EJB专门是干这个的。不过既然你是搞delphi的,给你你也不懂。
Delphi有详细的例子
然后我们用XML文件做载体的方式,传输的时候做压缩、加密,这样安全性相对比较可靠了,但是我们现在用的方法都要另外生成影射文件,很烦琐。
所以我想delphi可不可以直接对xml操作来实现和数据库的交互呢?
操作XML可以用XMLDocument
可以考虑三层结构,中间传送的是XML。
SOAP也是如此
可以给点代码吗?
......这种笨方法读的时候unit Linkup;interfaceuses
SysUtils, Windows, Messages, Classes, Graphics, Controls,
Forms, Dialogs, OleServer, MSXML2_TLB, Variants;type
TLinkupXML = class (TComponent)
private
FXMLDoc: TDOMDocument30;
function Orientation(var aNodeList: IXMLDOMNodeList): Boolean;
public
constructor Create(AOwner:TComponent);override;
destructor Destroy; override;
function Get_Value(aNodeIndex: Integer): string;
function Get_Name(aNodeIndex: Integer): string;
function NodeCount: Integer;
function isLinkupXML: Boolean;
procedure OpenXMLFile(aXMLFileName: String);
end;
procedure Register;implementationprocedure Register;
begin
RegisterComponents('Samples', [TLinkupXML]);
end;{
********************************** TLinkupXML **********************************
}constructor TLinkupXML.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FXMLDoc := TDOMDocument30.Create(nil);
end;destructor TLinkupXML.Destroy;
begin
inherited Destroy;
FXMLDoc.Free;
end;function TLinkupXML.Get_Name(aNodeIndex: Integer): string;
var
vNodeList: IXMLDOMNodeList;
begin
try
if Orientation(vNodeList) then
begin
if aNodeIndex >= vNodeList.length then
aNodeIndex := vNodeList.length - 1;
if aNodeIndex < 0 then
aNodeIndex := 0;
Result := vNodeList.item[aNodeIndex].nodeName; //返回Node名称
end
else //不是linkupXML返回空
Result := '';
except
Result := '';
end;
end;function TLinkupXML.Get_Value(aNodeIndex: Integer): string;
var
vNodeList: IXMLDOMNodeList;
begin
try
if Orientation(vNodeList) then
begin
if aNodeIndex >= vNodeList.length then
aNodeIndex := vNodeList.length - 1;
if aNodeIndex < 0 then
aNodeIndex := 0;
Result := vNodeList.item[aNodeIndex].text; //返回Node内容
end
else //不是linkupXML返回空
Result := '';
except
Result := '';
end;
end;function TLinkupXML.isLinkupXML: Boolean;
var
vNodeList: IXMLDOMNodeList;
begin
try
if Orientation(vNodeList) then
Result := True
else
Result := False;
except
Result := False;
end;
end;function TLinkupXML.NodeCount: Integer;
var
vNodeList: IXMLDOMNodeList;
begin
try
if Orientation(vNodeList) then
Result := vNodeList.length
else
Result := -1;
except
Result := -1;
end;
end;procedure TLinkupXML.OpenXMLFile(aXMLFileName: String);
begin
FXMLDoc.DefaultInterface.async := False;
FXMLDoc.DefaultInterface.load(aXMLFileName);
end;function TLinkupXML.Orientation(var aNodeList: IXMLDOMNodeList): Boolean;
begin
try
//aNodeList := FXMLDoc.DefaultInterface.selectNodes('linkup');
aNodeList := FXMLDoc.DefaultInterface.selectNodes('GFLOWASSISTANTINTERFACE');
aNodeList := aNodeList.item[0].childNodes;
if aNodeList.length > 0 then
begin
Result := True
end
else
Result := False;
except
Result := False;
end;
end;
end.你自己看看吧鄙视你一下先!---------
春困秋乏夏打盹,睡不醒的冬三月 ^^!
var xml:txmldocument;
root,node1:ixmlnode;
tabname,fname:string;
begin
xml:=TXMLDocument.Create(application);
xml.XML.LoadFromFile(opendialog1.FileName);
xml.Active:=true;
root:= xml.DocumentElement.ChildNodes.First;
root:= root.ChildNodes.FindNode('Table1');
tabname:= root.Attributes['Tablename'];
node1:= root.ChildNodes.FindNode('Fields');
fname:= node1.ChildNodes.FindNode('FieldName').Text;
xml.Active:=false;
end;
然后把ADODS和CDS都Open一下。
然后调用CDS的SaveToFile,批定文件名和格式(dfXML),即可将数据表生成一个XML文件到另一边后也是放一个CDS,然后用LoadFromFile即可导入,然后自己想办法吧CDS里的数据导到B.test里吧(最简单的办法是用循环了)
你说的方法,我在应用程序里实现了,没有问题,但是如果写ActiveX的话,就出问题
帮我看一下下面这个帖子吧
http://expert.csdn.net/Expert/topic/2474/2474643.xml?temp=.3731195
先谢了!
"放三个控件:ADODataSet(Select A.test 中的数据), DataSetProvider, ClientDataSet
然后把ADODS和CDS都Open一下。
然后调用CDS的SaveToFile,批定文件名和格式(dfXML),即可将数据表生成一个XML文件"DataSetProvider干什么用呢?我没用过ClientDataSet,能说详细些吗?
这里的用法很简单:
把DataSetProvider的DataSet属性设置为ADODataSet即可,然后把ClientDataSet的ProviderName属性设置为DataSetProvider即可,只要写三行代码:
ADODataSet.Open;
ClientDataSet.Open; // 甚至上一句也可以不要,CDS会自动操作
ClientDataSet.SaveToFile( 'filename.xml', dfXML );
即可将ADODataSet中的内容保存为filename.xml