使用LoadfromFile从文本导入的数据能保存到数据库吗?(50分)

  • 主题发起人 主题发起人 寻找
  • 开始时间 开始时间

寻找

Unregistered / Unconfirmed
GUEST, unregistred user!
我用SaveToFile将数据保存到一个文件中,然后清空数据库,再用Loadfromfile将刚才保存
的数据导入到数据库,但失败。请问能不能这样做的呢?如果能,双如何实现??
 
用的什么?Ado数据集?存成xml?
 
说得不清楚!
 
我是用ADODataSet1的SavetoFile将数据保存出来,然后清空数据库,再用ADODataSet1
的Loadfromfile将数据保存到数据库,请问这样行吗?
 
应该没有问题,我在SQL SERVER 7。0中这样用过
 
请问jasper
你是如何做的呢?为什么我做就不能呢?
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=964542

Briefcase模式的意思是能够让客户端暂时脱离服务器工作,以后再将客户端和服务器
相连的时候能够把脱离期间所作的修改更新回数据库。所以Ado数据集组件提供了
savetofile和loadfromfile两个方法。
而你先把读取的数据存成xml文件(注意此时每条记录的状态都是未修改),然后你更新
数据库里的记录。再从xml中load数据(此时每条记录的状态都是未修改),最后更新的
时候当然没有达到你要的效果!UpdateBatch的default参数是arAll。
应该先把数据库中记录读到前台,然后更改数据之后Save成xml(不更新回数据库)。
然后(或以后运行时)Load Xml文件再将以前所作修改UpdateBatch回数据库!
 
GanQuan:
   那我非要将Save出来的XML文件更新回数据库,那具体怎样做呢?因为我工厂比较大
要将不同地方的数据集合在一齐!急![:(]
 
你的意思是说在别处Save来的文件,到这里来load,而且两个数据表的结构相同,是不是?
这样做,你先用一个AdoTalbe来LoadFromFile,在用另一个AdoTable来连接你后台的
数据库表。然后一条一条添加就行了。
procedure TForm1.Button1Click(Sender: TObject);
begin
//先连接你的Adotable2到后台要添加的数据库表。设计期设置好或写代码动态设置。
Adotable2.Open;
AdoTable1.LoadFromFile('temp.xml');//用一个adotable来load别处存的数据。
AdoTable1.First;
while not AdoTable1.Eof do
begin
AdoTable2.Insert;//一条一条添加,你的结构完全相同。
AdoTable2.FieldByName('id').Value := AdoTable1.FieldByName('id').value;
AdoTable2.FieldByName('name').value := AdoTable1.FieldByName('name').value;
//..............
Adotable2.Post;
AdoTable1.Next;
end;
Adotable2.Close
end;
或者使用Sql语句一次性添加所以Adotable1中的数据。
 
一条一条加,速度太慢了!没有别的更快的方法?
 
如果速度不可接受的话,你可以使用sql语句执行插入
不过需要构造Sql语句。先用Query连接数据源
AdoTable2.LoadFromFile('temp.xml');
AdoQuery1.Close;
AdoQuery1.SQL.Clear;
AdoTable2.First;
while not AdoTable2.Eof do
begin
S1 := inttoStr(AdoTable2.FieldByName('id').value);
S2 := AdoTable2.fieldbyname('Name').Value;
S3 := DateTimeToStr(AdoTable2.Fieldbyname('savedate').value);
SqlString :='insert into ' + AdoTable1.TableName + ' values(' + S1 + ',' + '''' + S2 + '''' + ',' + '''' + S3 +'''' +')';
//需要根据你的表字段类型构造相应的Sql语句,每条记录构造一个insert语句。
AdoQuery1.SQL.Add(SqlString);
AdoTable2.Next;
end;
// showmessage(Adoquery1.SQL.text);
AdoQuery1.ExecSQL;

你试试速度如何?
 
给你几个函数,不要使用SaveToFile。

将数据集保存为CSV文件格式,Memo类字段中的回车符被替换为‘#’,不支持其他Blob字段。
也可从CSV文件导入。

CSV文件可以使用Excel编辑、处理。

unit Share;

interface
uses
Sysutils,IniFiles,classes,ShellApi,FileCtrl,DBTables,Db;


procedure ExportDataSetToCSVFile(const aDataSet:TDataSet;
const aFileName:string);
procedure ImportFromCSVFile(const AFileName:String;
const ADataSet:TDataSet);
function GetLeftWord(var ASentence:string; ADelimiter:char):string;
function GetLeftWordCSV(var ASentence:string):string;



implementation

function GetLeftWordCSV(var ASentence:string):string;
begin
Result:='';
ASentence:=Trim(ASentence);
if Length(ASentence)=0 then exit;
if ASentence[1]='"' then begin
Delete(ASentence,1,1);
Result:=GetLeftWord(ASentence,'"');
GetLeftWord(ASentence,',');
end else
Result:=GetLeftWord(ASentence,',');
end;

function GetLeftWord(var ASentence:string; ADelimiter:char):string;
var i:integer;
begin
Result := '';
i := Pos(ADelimiter,ASentence);
if i = 0 then begin
Result := Trim(ASentence);
ASentence := '';
end else begin
Result:=trim(Copy(ASentence,1,i-1));
Delete(ASentence,1,i);
end;
end;

procedure ExportDataSetToCSVFile(const aDataSet:TDataSet;
const aFileName:string);
var aTextFile:TextFile;
i:integer;
aValue,LineStr:string;
DataSetActive:boolean;
begin
DataSetActive := aDataSet.Active;
if not aDataSet.Active then aDataSet.Open;
aDataSet.DisableControls;
try
aDataSet.FieldDefs.Update;
if aDataSet.RecordCount=0 then exit;
try
AssignFile(aTextFile,aFileName);
Rewrite(aTextFile);
LineStr := '';
for i:=0 to aDataSet.FieldCount-1 do begin
aValue := aDataSet.Fields.DisplayName ;
if Pos(',',aValue) > 0 then aValue:='"' + aValue + '"';
LineStr := LineStr + aValue + ',';
end;
Delete(LineStr,length(LineStr),1);// remove extra ','
Writeln(aTextFile,LineStr);
aDataSet.First;
while not aDataSet.EOF do begin
LineStr := '';
for i := 0 to aDataSet.FieldCount-1 do begin
if aDataSet.Fields.IsBlob then begin
if aDataSet.Fields.DataType=ftMemo then
aValue :=StringReplace(aDataSet.Fields.AsString,#13+#10,'#',[rfReplaceAll]);
end else begin
aValue := aDataSet.Fields.AsString;
end;
if Pos(',',aValue) > 0 then aValue := '"' + aValue + '"';
LineStr := LineStr+aValue+',';
end;
Delete(LineStr,length(LineStr),1);// remove extra ','
Writeln(aTextFile,LineStr);
aDataSet.Next;
end;// while
finally
try
Flush(aTextFile);
CloseFile(aTextFile);
except
end;
end;
finally
aDataSet.EnableControls;
aDataset.Active := DataSetActive;
end;
end;

procedure ImportFromCSVFile(const AFileName:String;
const ADataSet:TDataSet);
const cMaxFields=1023;
var
aTextFile:TextFile;
i,j,HeaderCount:integer;
FldPtr:array[0..cMaxFields] of integer;
aColValue,aLineString,aValue:string;
HasCommonField,DataSetActive:boolean;
begin
if not FileExists(AFileName) then exit;
AssignFile(aTextFile,AFileName);
Reset(aTextFile);
try
Readln(aTextFile, ALineString);
HasCommonField:=False;
HeaderCount:=0;
DataSetActive:=ADataSet.Active;
if not ADataset.Active then ADataset.Open;
ADataSet.FieldDefs.Update;
while (length(ALineString) > 0) and (HeaderCount < cMaxFields) do begin
aColValue := GetLeftWordCSV(ALineString);
for i:=0 to ADataSet.FieldCount-1 do
if ADataSet.Fields.DisplayName=aColValue then
begin
j :=i;
FldPtr[HeaderCount] := j;
if j > -1 then HasCommonField:=True;
inc(HeaderCount);
break;
end;
end;
if not HasCommonField then exit;
ADataSet.DisableControls;
try
while not EOF(aTextFile) do begin
Readln(aTextFile,ALineString);
j := -1;
ADataSet.Append;
while (length(ALineString) > 0) and (j < HeaderCount-1) do begin
aColValue := GetLeftWordCSV(ALineString);
inc(j);
if FldPtr[j] = -1 then continue; // skip unmatched columns
try
if ADataSet.Fields[FldPtr[j]].DataType=ftMemo then
ADataSet.Fields[FldPtr[j]].AsString :=StringReplace(aColValue,'#',#13+#10,[rfReplaceAll])
else
ADataSet.Fields[FldPtr[j]].AsString := aColValue;
except
//DoSomeThing
end;
end;
ADataSet.Post;
end;
finally
ADataSet.EnableControls;
ADataSet.Active := DataSetActive;
end;
finally
CloseFile(aTextFile);
end;
end;
end.
 
导入时Memo字段中的“#”会被换成回车,如果你的数据本身带“#”,请换一个不常用的其他字符。
 
这也是遍历循环赋值啊!
速度和loadfromfile后循环赋值或构造Sql执行相比有优势吗?
 
几钟方法的速度不会相差很大的。想想都觉得是如此。
 
多人接受答案了。
 
后退
顶部