View Full Version : سوال: نحوه كار با فيلد Image مربوط به SQL در دلفي
mehdi_moosavi
سه شنبه 12 آبان 1394, 15:53 عصر
وقت دوستان بخير
اين كد براي تغيير يك فيلد String هست كه از مقدار يك فيلد ديگه خونده ميشه:
NET.Append;
NETM1.AsString:=NETNAME.AsString;
NET.Post;
حالا اگه نوع اين دو فيلد Image باشه كد بايد چطور نوشته بشه؟
لطفا راهنمايي كنيد
با تشكر
ابوالفضل عباسی
سه شنبه 12 آبان 1394, 17:14 عصر
بانکت sql هست؟اگر Access هست از این کدها استفاده کن
برای ذخیره سازی:
var Field: TBlobField;
Stream: TStream;
begin
if ADOQuery.Active and (Image.Picture.Graphic <> nil) then
begin
ADOQuery.Insert;
Field := TBlobField(ADOQuery.FieldByName('ImageData')); // ensure it ís a blob
Stream := ADOQuery.CreateBlobStream(Field, bmWrite);
try
Image1.Picture.Graphic.SaveToStream(Stream);
finally
Stream.Free;
ADOQuery.Post;
end;
end;
end;
برای خواندش:
var Field: TBlobField;
Stream: TStream;
Jpg: TJPEGImage;
begin
if ADOQuery.Active then
begin
Field := TBlobField(ADOQuery.FieldByName('ImageData'));
Stream := ADOQuery.CreateBlobStream(Field, bmRead);
Jpg := TJPEGImage.Create;
try
Jpg.LoadFromStream(Stream);
Image.Picture.Graphic := Jpg;
finally
Img.Free;
Stream.Free;
end;
end;
end;
موفق باشی (درضمن اگر بانکت sql server هست بگو که یه کد دیگه بدم)
mehdi_moosavi
سه شنبه 12 آبان 1394, 18:42 عصر
تشکر دوست محترم
من که توی عنوان پست نوشتم SQL
یوسف زالی
سه شنبه 12 آبان 1394, 21:07 عصر
فرقی نمی کنه، در هر دو دی بی ام اس نوع داده blob هست، اگر مبدا و مقصد هر دو روی یک instance هستند بهتره از کوئری برای آپدیت استفاده بشه، این طوری نیازی به دو بار رفت و آمد دیتا اون هم از نوع blob از سرور به کلاینت نیست.
ابوالفضل عباسی
چهارشنبه 13 آبان 1394, 08:46 صبح
دوست عزیز ببخشید من فکر کردم با فرمان sql که توی کوئری استفاده میشه گفتی.:بامزه:
خب این هم فرمان برای بانک sql server:
ذخیره سازی:
var ms:tmemorystream;
Begin
ms:=tmemorystream.create;
ms.position:=0;
image1.picture.bitmap.savetostream(ms);
ms.position:=0;
with yourfield as tblobfield do
loadfromstream(ms);
freeandnil(ms);
end;
برای خواندن:
var ms:tmemorystream;
Begin
ms:=tmemorystream.create;
ms.position:=0;
with yourfield as tblobfield do
savetostream(ms);
ms.position:=0;
image1.picture.bitmap.loadfromstream(ms);
freeandnil(ms);
end;
این کارت رو راه می اندازه ولی به کد زیر هم یه نگاهی بکن اون هم جواب کارت رو میده:(ولی کمی طولانیه:لبخند:)
uses jpeg, pngimage;
type
TitTYPES=(itJPG,itPNG,itBMP);
procedure TForm1.Button1Click(Sender: TObject);
var
jp:TJpegimage;
g:TGraphic;
begin
jp:=TJpegimage.Create;
try
ads.Close;
jp.LoadFromFile('C:\Bilder1\PIC.jpg');
ads.SQL.Text := 'Insert into IMGBlob (ID,Blob,typ) Values (:ID,:BLOB,:typ)';
ads.Parameters[0].Value := 1;
ads.Parameters[1].Assign(jp);
ads.Parameters[2].Value := itJPG;
ads.ExecSQL;
ads.SQL.Text := 'Select * from IMGBlob where ID=:ID';
ads.Parameters[0].Value := 1;
ads.Open;
try
case TitTYPES(ads.FieldByName('typ').AsInteger) of
itJPG: g:=TJpegimage.Create;
itPNG: g:=TPNGImage.Create;
itBMP: g:=TBitmap.Create;
end;
g.Assign(ads.FieldByName('Blob'));
Image1.Picture.Assign(g);
finally
g.Free;
end;
finally
jp.Free;
end;
end;
موفق باشی:چشمک:(این ها رو توی یه BUTTON باید بذاری اگر خواستی بگو بصورت function هم دارم برات بگذارم اون طوری حجم کد نویسی کمتره)
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.