View Full Version : سوال: درج عکس در دیتابیس
gbg
پنج شنبه 03 اسفند 1391, 13:27 عصر
سلام
وقتی یه جدول رو با دستورات T-sql پر میکنم فیلد عکس رو چطور درج کنم؟
qry1.sql.add(insert into cars (name,type,pic) valeus("BMW",1,nil);
منضورم فیلد pic در گزارش بالا هستش
qry1 رو در زمان رانتایم ساختم
hassan_reza
پنج شنبه 03 اسفند 1391, 13:41 عصر
insert into cars (name,type,pic) values('Benz',3, FILE_READ('file.jpg'));
gbg
پنج شنبه 03 اسفند 1391, 13:58 عصر
ممنون اگه فایل نباشه چی؟
samani
پنج شنبه 03 اسفند 1391, 14:03 عصر
براي اينكار شما محتويات عكس كه به شكل باينري يا Stream هست رو به رشته اي از Hex تبديل كن
function GetBitmapHexString(aBitmap: TBitmap): string;
var
ms: TStream;
i: integer;
b: byte;
begin
Result := '';
ms := TMemoryStream.Create;
try
aBitmap.SaveToStream(ms);
ms.Position := 0;
for i := 1 to ms.Size do
begin
ms.Read(b, 1);
Result := Result + IntToHex(b, 2);
end;
finally
ms.Free;
end;
if Result <> '' then
Result := '0x' + Result;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
HexString: string;
begin
HexString := GetBitmapHexString(Image1.Picture.Bitmap);
if HexString = '' then
HexString := 'NULL';
qry1.sql.add('insert into cars (name, type, pic) valeus(''BMW'', 1, ' + HexString + ')');
end;
gbg
شنبه 05 اسفند 1391, 18:54 عصر
براي اينكار شما محتويات عكس كه به شكل باينري يا Stream هست رو به رشته اي از Hex تبديل كن
function GetBitmapHexString(aBitmap: TBitmap): string;
var
ms: TStream;
i: integer;
b: byte;
begin
Result := '';
ms := TMemoryStream.Create;
try
aBitmap.SaveToStream(ms);
ms.Position := 0;
for i := 1 to ms.Size do
begin
ms.Read(b, 1);
Result := Result + IntToHex(b, 2);
end;
finally
ms.Free;
end;
if Result <> '' then
Result := '0x' + Result;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
HexString: string;
begin
HexString := GetBitmapHexString(Image1.Picture.Bitmap);
if HexString = '' then
HexString := 'NULL';
qry1.sql.add('insert into cars (name, type, pic) valeus(''BMW'', 1, ' + HexString + ')');
end;
به شدت کنده
samani
شنبه 05 اسفند 1391, 23:45 عصر
تو عكسهاي حجيم ممكن تا حدودي كند بشه براي مثال اگه حجم عكس 2 مگابايت باشه خروجي تابع 4 مگابايت رشته است كه ساختن رشته داخل حلقه كند ميشه ولي شما براي حل اين مشكل ميتونيد از getmem و تبديل آن به هگز از shl استفاده كنيد تابع زير براي تبديل استريم به رشته با سرعت بالاست كه فايل 2 مگابايتي رو كمتر از 30 ميلي ثانيه تبديل به رشته هگز ميكنه
function StreamToString(Stream: TStream): String;
var
Size: Integer;
p: PChar;
begin
Size := Stream.Size;
SetLength(Result, Size * 2);
GetMem(p, Size);
Stream.Position := 0;
Stream.Read(p^, Size);
BinToHex(p, PChar(@Result[1]), Size);
FreeMem(p, Size);
end;
function GetBitmapHexString(aBitmap: TBitmap): string;
var
ms: TStream;
begin
Result := '';
ms := TMemoryStream.Create;
try
aBitmap.SaveToStream(ms);
Result := StreamToString(ms);
finally
ms.Free;
end;
if Result <> '' then
Result := '0x' + Result;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
HexString: string;
sl: TStringList;
t: Cardinal;
begin
sl := TStringList.Create;
try
t := GetTickCount;
HexString := GetBitmapHexString(Image1.Picture.Bitmap);
t := GetTickCount - t;
if HexString = '' then
HexString := 'NULL';
sl.Text := HexString;
sl.SaveToFile('HexString.txt');
finally
sl.Free;
ShowMessage(IntToStr(t));
end;
end;
gbg
یک شنبه 06 اسفند 1391, 14:13 عصر
ارور می گیره :FreeMem(p, Size);
و همچنین ms.Free;
خطوط 15 و 28 در پست بالا
samani
یک شنبه 06 اسفند 1391, 16:00 عصر
تو دلفي 7و XE3 تست شده مشكلي نداره
كدي رو كه نوشتي درست چك كن و همينطور FreeMem رو هم چك كن كه از توابع يونت System باشه شايد يونيت ديگري يوز هست كه بعد از System تعريف شده
gbg
یک شنبه 06 اسفند 1391, 16:43 عصر
ذرست شد حجم عکس من دو مگ هست
کوئری که اجرا میشه بعد سه دقیقه رور میگره و تایم اوت میده
gbg
یک شنبه 06 اسفند 1391, 16:50 عصر
insert into cars (name,type,pic) values('Benz',3, FILE_READ('file.jpg'));
این هم تست کردم کار نکرد مگه این تابع وجود نداره
Msg 195, Level 15, State 10, Line 1
'FILE_READ' is not a recognized built-in function name
اسکول 2008
gbg
یک شنبه 06 اسفند 1391, 18:16 عصر
من خودم از این روش استفاده می کنم ولی 2 ثانیه طول میکشه
ms := TMemoryStream.Create;
CBitmap.SaveToStream(ms);
ms.Seek(0,0);
qry1:=TADOQuery.Create(nil);
qry1.Connection:=frmDataModule.conMowjCars;
qry1.sql.add('insert into cars (name,type,pic) valeus('+Carname+','+inttostr(CType)+',:Ppic');
qry1.Parameters[0].Attributes := [paLong];
qry1.Parameters[0].DataType := ftBlob;
qry1.Parameters[0].LoadFromStream(ms,ftBlob);
qry1.ExecSQL;
qry1.Free;
ms.free;
:افسرده:
ادیت :
بعضی وقت ها کلا رکورد رو هم ادد نمی کنه و ارور هم نمیگیره
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.