نقل قول نوشته شده توسط مهران رسا مشاهده تاپیک
در طول انجام یه پروژه نیاز شد تا از بانک 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 کننده هم استفاده کنید.

من نمي توانم پروژه را اجرا کنم راجع به اين سه فايل پيغام ميدهد؟
WideStrings, DBXMySql

[Fatal Error] Unit1.pas(11): File not found: 'WideStrings.dcu'
ممنون مي شوم کمک کنيد
ضمنا درایور های مربوطه (dbxmys.dll و libmySQL.dll) را از کجا بياورم؟؟