در طول انجام یه پروژه نیاز شد تا از بانک Mysql به صورت داخلی پشتیبان بگیرم. یه نمونه کد نوشتم که البته بیشتر وقتم صرف قسمت پردازش رشته ای و ذخیره و بازیابی اطلاعات شد.
نکات قابل توجه مورد استفاده در این برنامه :
- استفاده از کلاس ini برای ذخیره سازی اطلاعات جداول در فایل
- استفاده از توابع String Encoder برای حفظ امنیت اطلاعات جداول
- استفاده از کامپوننت DbExpress برای تعامل با MySQL
ضمیمه 74846
procedure TForm1.CreateBackup;
var
i, j: integer;
IniFile: TIniFile;
TableName, FieldName, FieldValue, TmpValues, CodedStr: string;
var
StrEnc: TStrEncoder;
begin
if LST.Items.Count < 1 then
begin
LbSt.Caption := 'Status : Canceled';
exit;
end;
SaveDlg.FileName := '';
SaveDlg.Filter := 'M8B Files|*.m8b';
SaveDlg.DefaultExt := 'm8b';
SaveDlg.Execute();
if SaveDlg.FileName = '' then
begin
LbSt.Caption := 'Status : Canceled';
exit;
end;
if FileExists(SaveDlg.FileName) then
DeleteFile(SaveDlg.FileName);
StrEnc := TStrEncoder.Create(nil);
IniFile := TIniFile.Create(SaveDlg.FileName);
Pr.Position := 0;
Pr.Max := LST.Items.Count - 1;
try
for i := 0 to LST.Items.Count - 1 do
begin
Pr.Position := i;
TableName := LST.Items[i].Caption;
if LST.Items[i].Checked then
begin
// Get list of fileds
Qry.SQL.Text := 'SHOW COLUMNS FROM ' + TableName;
Qry.Open;
while not(Qry.Eof) do
begin
FieldName := Qry.Fields[0].AsString;
if FieldName <> '' then
begin
Qry2.SQL.Text := 'SELECT ALL `' + FieldName + '` FROM `' +
TableName + '`';
Qry2.Open;
if Qry2.RecordCount > 0 then
begin
TmpValues := '';
Pr2.Position := 0;
Pr2.Max := Qry2.RecordCount;
for j := 0 to Qry2.RecordCount - 1 do
begin
Pr2.Position := j;
FieldValue := Qry2.FieldByName(FieldName).AsString;
if FieldValue = '' then
begin
FieldValue := SEmpty;
CodedStr := FieldValue;
end
else
begin
CodedStr := StrEnc.StringCoder(FieldValue);
end;
TmpValues := TmpValues + ',' + CodedStr;
Qry2.Next;
end; // for j
IniFile.WriteString(TableName, FieldName, TmpValues);
end; // if Qry2.RecordCount
end; // if FieldName <> ''
Qry.Next;
end; // while not(Qry.Eof)
end; // if LST.Items[i].Checked
end;
finally
IniFile.free;
StrEnc.free;
end; // try
Pr.Max := 1;
Pr.Position := Pr.Max;
Pr2.Max := 1;
Pr2.Position := Pr2.Max;
LbSt.Caption := 'Status : Done';
end;
procedure TForm1.RestoreBackup;
var
StrEnc: TStrEncoder;
var
IniFile: TIniFile;
Tstr, TstrSectionValues, TstrValues: TStringList;
i, j, k, m, Cl: integer;
TableName, FieldName, GroupValue: string;
Tmp, Tmp2, Tmp3, SqlSmnt: string;
VArray: array of array of string;
begin
OpenDlg.FileName := '';
OpenDlg.Filter := 'M8B Files|*.m8b';
OpenDlg.DefaultExt := 'm8b';
OpenDlg.Execute();
if OpenDlg.FileName = '' then
exit;
LST2.Items.Clear;
StrEnc := TStrEncoder.Create(nil);
IniFile := TIniFile.Create(OpenDlg.FileName);
Tstr := TStringList.Create;
TstrSectionValues := TStringList.Create;
TstrValues := TStringList.Create;
try
IniFile.ReadSections(Tstr);
Pr.Position := 0;
Pr.Max := Tstr.Count - 1;
for i := 0 to Tstr.Count - 1 do
begin
TableName := Tstr[i];
SqlSmnt := 'INSERT INTO `' + TableName + '` (';
Pr.Position := i;
IniFile.ReadSection(TableName, TstrSectionValues);
Tmp := '';
Tmp2 := '';
TstrValues.Clear;
for j := 0 to TstrSectionValues.Count - 1 do
begin
FieldName := TstrSectionValues[j];
Tmp := Tmp + '`' + FieldName + '`,';
GroupValue := IniFile.ReadString(TableName, FieldName, '');
StrEnc.split(',', GroupValue, TstrValues);
end;
Cl := (TstrValues.Count) div (TstrSectionValues.Count);
Pr2.Position := 0;
Pr2.Max := Cl - 1;
for k := 0 to Cl - 1 do
begin
Pr2.Position := k;
m := k;
Tmp3 := '';
while (m < (TstrValues.Count)) do
begin
if UpperCase(TstrValues[m]) = SEmpty then
Tmp2 := ''
else
Tmp2 := StrEnc.StringDecoder(TstrValues[m]);
Tmp3 := Tmp3 + '"' + Tmp2 + '",';
m := m + Cl;
end;
SqlSmnt := SqlSmnt + copy(Tmp, 1, length(Tmp) - 1) + ') VALUES(' + copy
(Tmp3, 1, length(Tmp3) - 1) + ')';
Qry.SQL.Text := SqlSmnt;
try
Qry.ExecSQL;
except
on e: exception do
begin
LST2.Items.Add('Table ' + TableName + ' : ' + e.Message);
end;
end;
SqlSmnt := 'INSERT INTO `' + TableName + '` (';
end;
end;
finally
StrEnc.free;
IniFile.free;
Tstr.free;
TstrSectionValues.free;
TstrValues.free;
end;
Pr.Max := 1;
Pr.Position := Pr.Max;
Pr2.Max := 1;
Pr2.Position := Pr2.Max;
end;
نکته 1 : برای ارتباط DbExpress با Mysql به درایور های مربوطه (dbxmys.dll و libmySQL.dll) نیاز دارید.
نکته 2 : پیشنهاد میشه به صورت دلخواه از توابع Optimize کننده هم استفاده کنید.