Delphi中如何备份数据表为insert 脚本
delphi吧
全部回复
仅看楼主
level 8
unit Unit1; interface usesWinapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,System.Classes, Vcl.Graphics,Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Data.DB,Datasnap.DBClient; typeTForm1 = class(TForm)cds: TClientDataSet;Button1: TButton;Button2: TButton;procedure Button1Click(Sender: TObject);procedure Button2Click(Sender: TObject);private{ Private declarations }procedure ExportData(const tableNames: string);procedure ImportData(const fileName, tableNames: string);public{ Public declarations }end; varForm1: TForm1; implementation {$R *.dfm} uses untDB; procedure TForm1.Button1Click(Sender: TObject);beginExportData('bas_kind,bas_goods');end; procedure TForm1.Button2Click(Sender: TObject);beginImportData(ExtractFilePath(Application.ExeName) + 'export.sql', 'bas_kind,bas_goods');end; procedure TForm1.ExportData(const tableNames: string);varsql, err: string;sl, tables: TStringList;i, h: Integer;fieldNames, values: string;function GetValue(field: TField): string;begincase field.DataType offtString, ftTimeStamp:beginResult := QuotedStr(field.AsString);end;ftBoolean:begincase field.AsBoolean oftrue: Result := '1';false: Result := '0';end;end;elseif not VarIsNull(field.Value) thenbeginResult := VarToStr(field.Value);endelseResult := 'null';end;end; beginif tableNames = '' thenexit;tables := TStringList.Create;tables.Delimiter := ',';tables.DelimitedText := tableNames;sl := TStringList.Create;sl.Clear;for h := 0 to tables.Count - 1 dobeginsql := 'select * from ' + tables[h];if frmDB.QuerySQL(sql, cds, err) and (not cds.IsEmpty) thenbegincds.First;while not cds.Eof dobeginfieldNames := '';values := '';for i := 0 to cds.FieldCount - 1 dobeginif fieldNames = '' thenbeginfieldNames := cds.Fields[i].FieldName;endelsebeginfieldNames := fieldNames + ',' + cds.Fields[i].FieldName;end;if values = '' thenbeginvalues := GetValue(cds.Fields[i]);endelsebeginvalues := values + ',' + GetValue(cds.Fields[i]);end;end;sl.Add('insert into ' + tables[h] + '(' + fieldNames + ') values (' +values + ')');cds.Next;end;end;end;sl.SaveToFile(ExtractFilePath(Application.ExeName) + 'export.sql');sl.Free;tables.Free;end; procedure TForm1.ImportData(const fileName, tableNames: string);varcmd, tables: TStringList;err, sql: string;i: Integer;beginif (not FileExists(fileName)) or (tableNames = '') thenexit;tables := TStringList.Create;tables.Delimiter := ',';tables.DelimitedText := tableNames;for i := 0 to tables.Count - 1 dobeginsql := 'truncate table ' + tables[i];frmDB.ExecuteSQL(sql, err);end;tables.Free; cmd := TStringList.Create;cmd.LoadFromFile(fileName);frmDB.ExecuteSQL(cmd.Text, err);cmd.Free;end; end.
2015年08月04日 08点08分 1
level 8
楼主,你的高尚情操太让人感动了。在现在这样一个物欲横流的金钱社会里,竟然还能见到楼主这样的性情中人,无疑是我这辈子最大的幸运。让我深深感受到了人性的伟大。楼主的帖子,就好比黑暗中刺裂夜空的闪电,又好比撕开乌云的阳光,一瞬间就让我如饮甘露,让我明白了永恒的真理在这个世界上是真实存在着的。只有楼主这样具备广阔胸怀和完整知识体系的人,才能作为这真理的惟一引言者。看了楼主的帖子,我陷入了严肃的思考中。我认为,如果不把楼主的帖子顶上去,就是对真理的一种背叛,就是对谬论的极大妥协。因此,我决定义无返顾地顶了!
2015年08月05日 01点08分 2
level 9
看到头晕,等什么时候不头晕再来回答 [哈哈]
2015年08月06日 00点08分 3
level 8
很久很久以前,天是蓝的,水是绿的,庄稼是种在田里的,肉还是放心吃的,老鼠还是怕猫的,法庭还是讲理的,银行还是敢存钱的,发廊还是只管剪头发的,照相还是穿着衣服的、人民大会堂还是坐着人民的,看帖还是要回帖的……
2015年08月06日 06点08分 4
1