PDA

View Full Version : سوال: ذخیره کردن یک فایل EXE درج شده در دیتابیس در دیسک محلی



hamid-nic
سه شنبه 05 آبان 1394, 12:45 عصر
سلام دوستان وقتتان بخیر
با استفاده از یک sp یک فایل exe را در جدولی در بانک ذخیره می کنم به این شکل :

ADOStoredProc1.Close ;
ADOStoredProc1.Parameters.ParamByName('@CodeExe'). value:=strtoint(edit2.text);
ADOStoredProc1.Parameters.ParamByName('@ExeFile'). LoadFromFile(OpenDialog1.FileName,ftTypedBinary );
ADOStoredProc1.ExecProc ;

حالا باید این فایل ذخیره شده را در یک فایل محلی ذخیره کنم با استفاده از یک sp به این شکل انتخابش می کنم :

ADOStoredProc2.Close ;
ADOStoredProc2.Parameters.ParamByName('@CodeExe'). value:=strtoint(edit3.text);
ADOStoredProc2.ExecProc ;

حالا به چه شکلی باید در محل دیسک ذخیره کنم ؟ خودم از stream ها استفاده کردم بدین شکل که فایل انتخاب شده را میریختم داخل streamFile اما وقتی ذخیره می کردم فایل exe درست نبود ؟:متفکر:
کلا روش بالا برای ذخیره و بازیابی فایل در دیتابیس درسته ؟

hamid-nic
سه شنبه 05 آبان 1394, 19:00 عصر
البته رویه اول یک رویه insert هست و رویه دوم یک رویه selectRow که هر دوتا درست کارشون را انجام می دهند هم insert و هم select
فقط مشکل در ذخیره اون فایل select شده در دیسک محلی است ؟:متفکر:

ابوالفضل عباسی
چهارشنبه 06 آبان 1394, 11:23 صبح
دوست عزیز شرمنده
بی زحمت یکم واضح تر سوالت رو بگو چون برای بنده کمی گنگ بود
شرمنده :کف:

hamid-nic
چهارشنبه 06 آبان 1394, 11:37 صبح
دوست عزیز شرمنده
بی زحمت یکم واضح تر سوالت رو بگو چون برای بنده کمی گنگ بود
شرمنده :کف:
خواهش می کنم ببینید :
یک جدول توی دیتابیس داریم که قراره یک فایل exe را در اون ذخیره کنیم با نوع varbinary(max) که کلاینت ها بتونند متصل بشند و آخرین فایل exe که گذاشته شده را بردارند .
حالا دو تا کار اساسی هست :
1- درج در دیتابیس
2- خواندن از دیتابیس و ذخیره اون در دیسک محلی خود کلاینت

این دو تا مراحل را دارم انجام می دهم مرحله اول را طبق دستورات پست اول insert کردم و در مرحله دوم اون را select میکنم اما نمی تونم اون فایل select شده از دیتابیس را در محل ذخیره کنم ؟
امیدوام خوب گفته باشم :ناراحت:

ابوالفضل عباسی
چهارشنبه 06 آبان 1394, 11:53 صبح
very good:بامزه:

بنظرم مشکل از varbinary هستش چون همچی که داره درست کار میکنه:متفکر:

Varbinary رو تغییر بده درست میشه.
بعد نوع بانکی که varbinary رو توش ذخیره میکنی از چه نوعیه؟

ابوالفضل عباسی
چهارشنبه 06 آبان 1394, 12:02 عصر
با این کد فایلت رو به هگزا تبدیل کن:

function Tform1.FileToHex(FileName: string): AnsiString;
var FS:TFileStream;
PS:PAnsiChar;
Block:array[0..1023] of byte; // 1Kb
len,i,pos:Integer;
B:Byte;
const Nibbs: array[0..15] of AnsiChar = ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F');
begin
FS := TFileStream.Create(FileName, fmOpenRead);
try
Result := '';
SetLength(Result, FS.Size * 2);
PS := PAnsiChar(Result);
pos := 0; // position into the result string
len := FS.Read(Block, SizeOf(Block));
while len <> 0 do
begin
for i:=0 to len-1 do
begin
B := Block[i];
PS[pos] := Nibbs[B div $F];
Inc(pos);
PS[pos] := Nibbs[B mod $F];
Inc(pos);
end;
len := FS.Read(Block, SizeOf(Block));
end;
finally FS.Free;
end;
end;

بعد توی بانک ذخیره کن و با دستور هگزا به String و بعد stream و یا مستقیم به stream تبدیل کن ببین مشکلت حل میشه

function HexToString(H: String): String;var I : Integer;
begin
Result:= '';
for I := 1 to length (H) div 2 do
Result:= Result+Char(StrToInt('$'+Copy(H,(I-1)*2+1,2)));
end;

اگر نخواستی کدی که برنامه رو به varbinary تبدیل میکنه قویتر کن.(دنیای stream دنیای خیلی بزرگیه):لبخند:

hamid-nic
چهارشنبه 06 آبان 1394, 12:20 عصر
very good:بامزه:

بنظرم مشکل از varbinary هستش چون همچی که داره درست کار میکنه
:متفکر:

Varbinary رو تغییر بده درست میشه.
بعد نوع بانکی که varbinary رو توش ذخیره میکنی از چه نوعیه؟


بانک sql server 2012 هست .
ممنونم روی کد بالا هم کار میکنم.

ابوالفضل عباسی
چهارشنبه 06 آبان 1394, 12:23 عصر
دوست عزیز متوجه نشدی.
1-اول از کد هایی که در بالا گفتم ببین کمکت میکنه یا نه.
2- منظورم نوع بانکه نه اسمش یعنی فیلد varbinary از نوع string یا char یا widestring یا .... این منظورمه

hamid-nic
چهارشنبه 06 آبان 1394, 12:42 عصر
دوست عزیز متوجه نشدی.
1-اول از کد هایی که در بالا گفتم ببین کمکت میکنه یا نه.
2- منظورم نوع بانکه نه اسمش یعنی فیلد varbinary از نوع string یا char یا widestring یا .... این منظورمه

نه دیگه varbinary خودش یه نوع از داده است که می تونه مقدار مشخص بگیره می تونه مقدار max بگیره .