# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > VB.NET >  عکس در دیتا بیس

## mes

سلام خدمت شما اساتید محترم
یه سوال دارم که راستش خیلی مهمه اگه زحمت بکشید و بگید دعاتون می کنم
عزیزان می تونید بهم بگید که چطوری میتونم یه فیلد عکسی رو که در یه فایل بانک اطلاعاتی دارم رو تو دیتا ریپورت وقتی اسم یه شخصی میاد عکسش هم جلوش بیاد منظورم اینکه چجوری میتونم این عکسایی  رو که توی فایلم دارم با یه شی ارتباطش بدم چون اون ایمیجی که تو ریپورت هست خاصیت دیتا نداره
خیلی خیلی ممنون می شم اگه بگید خدایی لنگم
خدا حافظ

----------


## روح اله معینی زاده

:lol:  با سلام

این کد رو یکی از بچه ها روی همین سایت گذاشته بود. هم امکان ذخیره و هم بازیابی رو داره.
البته من خودم که با DataEnvironment کار می کنم نتونستم با قسمت Load عکس کار کنم ولی ذخیرش مشکلی نداشت.

امیدوارم به دردتون بخوره.

با احترام- خدانگهدار

----------


## mes

> :lol:  با سلام
> 
> این کد رو یکی از بچه ها روی همین سایت گذاشته بود. هم امکان ذخیره و هم بازیابی رو داره.
> البته من خودم که با DataEnvironment کار می کنم نتونستم با قسمت Load عکس کار کنم ولی ذخیرش مشکلی نداشت.
> 
> امیدوارم به دردتون بخوره.
> 
> با احترام- خدانگهدار


منظورم آوردن عکس تو دیتا بیس تو یه دیتا ریپورت
اگه میشه زودتر

----------


## mes

به خدا خیلی فوریه اگه میشه بگین
من میخام از یه فایل بانک اطلاعاتی که دوتا فیلد داره یکی اسم و یکی عکس استفاده کنم و دیتا ریپورتی درست کنم که عکس هر کس رو جلوی اسمش بندازه 
شرمنده ببخشید که همچین سوالایی می پرسم
اگه میشه زودتر کفته برنامم رو اگه عکس نزارم نمی گیره 
دستتون درد نکنه
بازم میگم اگه میشه زودتر

----------


## mes

کمک :(

----------

سلام 
من این کار را با VB.Net و SQL Server تست کردم ... هیچ مشکل خاصی وجود نداشت  :!:  :?:  :!: 
در دیتابیس Northwind و جدول Categories یک فیلد وجود دارد که نوع آن Image است، یک گزارش روی این جدول درست کنین اگر عکس ها را در گزارش دیدین، مشکل از فیلد عکس شماست ولی اگر روی این جدول هم نتونستین انجام بدین، بگین تا براتون یک مثال درست کنم.
در ضمن شما می تونین از فیلد عکس در گزارش مانند فیلدهای معمولی استفاده کنین .

----------


## mes

من با بیسیک 6 کار می کنم و در ضمن من نمیتونم از ایمیج مثل یه فیلد تکست استفاده کنم اگه میشه برام یه مثال بیارید خیلی ممنون میشم
اگه میشه زودتر
باتشکر
ام.ای.اس

----------

متاسفانه من با VB6 کار نکردم .. 
در ضمن شما از CrystalReport استفاده می کنین ؟

----------


## mes

> متاسفانه من با VB6 کار نکردم .. 
> در ضمن شما از CrystalReport استفاده می کنین ؟


کمک کمک کمک کمک کمک کمک کمک کمک کمک کمک کمک کمک کمک کمک کمک کمک کمک کمک
شمارو به خدا یکی به من بگه چیار کنم
شاید سوالم روخوب نپسیدم
ببینید عزیزان ما یه فایل بانک   اطلاعاتی داریم که دوتا فیلد داره اسم و عکس و 100 تا رکورد داره می خایم یه دیتا ریپورت درس کنیم که اسم افراد رو جلو عکسشون بنویسه
تورو خدا کمکم کنید

 :(  :(  :(  :(  :(  :(  :(  :(  :(  :(  :(  :(  :(  :(

----------


## Abbas Arizi

دوست عزیز بعید میدونم توی DataReport امکان استفاده از فیلد تصویری وجود داشته باشه. چون اگه امکان داشت حتما تا الان یکی از دوستان راه حلش رو به شما گفته بود.

----------


## mes

> دوست عزیز بعید میدونم توی DataReport امکان استفاده از فیلد تصویری وجود داشته باشه. چون اگه امکان داشت حتما تا الان یکی از دوستان راه حلش رو به شما گفته بود.


تورو به خدا این رو نگو 
بدجوری وضع خرابه
پس چیکار کنم؟
یعنی برنامه نویسای ویژوال بیسیک برای عکس فکری نکردن
فک نمیکنم
بازم از تون ممنون میشم که از راه های دیگه راهنمایی م کنید

----------


## Abbas Arizi

باید از Crystal Reports استفاده کنید

----------


## mes

> باید از Crystal Reports استفاده کنید


ببخشید ولی چطور،یعنی چی؟

----------


## Abbas Arizi

یعنی باید برید نرم افزار Crystal Reports که یک نرم افزار گزارشگیری قوی هست رو از بازار تهیه کنید و گزارشهاتون را با اون بسازید.

----------


## mes

> یعنی باید برید نرم افزار Crystal Reports که یک نرم افزار گزارشگیری قوی هست رو از بازار تهیه کنید و گزارشهاتون را با اون بسازید.


تو اینتر نت نمی شه پیداش کرد
منظورم اینه حجمش چقدره

----------


## Abbas Arizi

فکر نمیکنم بصورت کامل از Internet بشه داونلودش کرد چون حجمش تقریبا زیاده. (البته بستگی به نوع اتصال شما داره)
به هر حال من الان آدرسی رو سراغ ندارم.

----------


## mes

> فکر نمیکنم بصورت کامل از Internet بشه داونلودش کرد چون حجمش تقریبا زیاده. (البته بستگی به نوع اتصال شما داره)
> به هر حال من الان آدرسی رو سراغ ندارم.


عباس جان اصمینان داری با اون کارمون را میوفته؟
البته واقعا از لطفی که کردین ممنونم

----------


## Abbas Arizi

بله. چون Crystal دیگه آخرشه. همین الان هم من یه تست کردم و دیدم که مشکلی نداره.

----------


## mes

> بله. چون Crystal دیگه آخرشه. همین الان هم من یه تست کردم و دیدم که مشکلی نداره.


خیلی آقایی
حتما پیداش می کنم

----------


## Abbas Arizi

قربون شما. شما لطف دارید. چون کار خاصی نکردم.

----------


## mes

> بله. چون Crystal دیگه آخرشه. همین الان هم من یه تست کردم و دیدم که مشکلی نداره.


خیلی آقایی
حتما پیداش می کنم

----------


## Voldemort

دوستان عزیز در وبلاگ خودم یک مقاله با فرمت PDF در زمینه ذخیره و بازیابی تصاویر ترجمه کرده ام. می توانید آن را دانلود کنید و از آن استفاده کنید. البته این مقاله در مورد ریپورتها نیست ولی می توانید آن را بسط دهید چون خیلی کلی است.

----------


## mes

> دوستان عزیز در وبلاگ خودم یک مقاله با فرمت PDF در زمینه ذخیره و بازیابی تصاویر ترجمه کرده ام. می توانید آن را دانلود کنید و از آن استفاده کنید. البته این مقاله در مورد ریپورتها نیست ولی می توانید آن را بسط دهید چون خیلی کلی است.


جادوگر جون اونرو قبلا خوندم ولی نتونستم جوابی برای خودم پیدا کنم
اگه میشه کمک

----------


## Voldemort

فکر می کنم مشکل در اینجاست که شما می خواهید از طریق Bind یک کنترل این کار را انجام دهید. اگر به مقاله بیشتر توجه کنید می بینید که این مقاله در ارتباط با ذخیره و بازیابی تصاویر در حقیقت با کدنویسی با فیلد Memo و فایلهای معمولی کار می کند و بنابراین محدودیتی در مکان اجرای آن نیست. چه در Report ها از آن استفاده کنید و چه در فرمها و یا هرجای دیگر. یکبار دیگر سعی خودتان را بکنید.

----------


## mes

> فکر می کنم مشکل در اینجاست که شما می خواهید از طریق Bind یک کنترل این کار را انجام دهید. اگر به مقاله بیشتر توجه کنید می بینید که این مقاله در ارتباط با ذخیره و بازیابی تصاویر در حقیقت با کدنویسی با فیلد Memo و فایلهای معمولی کار می کند و بنابراین محدودیتی در مکان اجرای آن نیست. چه در Report ها از آن استفاده کنید و چه در فرمها و یا هرجای دیگر. یکبار دیگر سعی خودتان را بکنید.


جادوگر جون کمک حل نمیشه
برنامرو ازم می خان
کمک :(  :(  :(  :(  :(  :(

----------


## mes

> نوشته شده توسط Abbas Arizi
> 
> بله. چون Crystal دیگه آخرشه. همین الان هم من یه تست کردم و دیدم که مشکلی نداره.
> 
> 
> خیلی آقایی
> حتما پیداش می کنم


شرمنده من این رو ÷یداش کردم و این فیلد عکس رو هم قرار می دم تو صفحه آما انگار نه انگار 
اگه میشه یه کمک دیگه
ممنوم
قربان شما
ام ای اس

----------


## Abbas Arizi

اگه میشه دقیقا بگید چیکار کردید تا شاید ما بتونیم اشکال کار رو متوجه بشیم.

----------


## mes

> اگه میشه دقیقا بگید چیکار کردید تا شاید ما بتونیم اشکال کار رو متوجه بشیم.


ببین من هیچ کاری نکردم اگه میشه بگید که چطور میتونم بعد از اد کردن یه کریستال ریپورت تو برنامم میتونم دو تا فیلد نام خانوادگی و عکس رو بیارم که جلوی هم نشون بده البته اتصال با بانک اطلاعاتی ش درسته
ممنونم که کمکم میکنید 
نمیدونم چطور از شما تشکر کنم
قربان شما
ام.ای.اس

----------


## Abbas Arizi

وقتی از منوی Project شما Crystal Report رو اضافه میکنی یک دیالوگ ظاهر میشه. از Option ها همون اولی و از  قسمت انتخاب Expert همون اولی یعنی Statndard (هر دو بصورت پیش فرض همین هستند)



وی OK کلیک کن.

در صفحه ای که ظاهر میشه روی Project کلیک کن. فرم انتخاب DataSource ظاهر میشود.



گزینه دوم یعنی ADO and OLE DB رو انتخاب کن و روی Build کلیک کن.



فرم انتخاب provider ظاهر میشه. Connection string رو مثل همونی که برای ADO ساختی اینجا هم بساز.

فرم بعدی که ظاهر میشه فرم انتخاب Recordset هست. روی SQL کلیک کن و روی TextBox پرس و جوی مربوط به رکوردست رو بنویس مثلا: SELECT * FROM Table1



روی OK کلیک کن. حالا روی همون صفحه اول (Standard Report Expert) روی Next کلیک کن تا به برگه بعدی ویزارد بری. اینجا محل ورود فیلدهاست. رو Add All کلیک کن تا همه فیلها به Report اضافه شوند.



حالا روی Finish کلیک کن.
الان Report آماده است ولی فیلد عکس رو اون نیست. برای آوردن فیلد عکس رو TreeView که سمت چپ Report قرار داره (Main Report) گره Database Fields رو باز کن با ماوس فیلد مربوط به عکس رو بگیر و بیار ش روی بخش Detalis گزارش (Drag&Drop)
تموم شد. فقط باید یه کم به ظاهر گزارش برسی.

امیدوارم که دیگه کارت راه بیفته.

----------


## mes

عباس جان البته کریسال من ورژن 9 و یکم با این فرق می کنه البته من همه این کارارو می کنم  وعکس رو هم می کشم میاد و فیلش میاد ولی تو اصلی که ریپورت میاد عکس رو نشون نمی ده
نمی دونم چرا 
بازم ممنون

----------


## Abbas Arizi

من توی ورژن همراه VS.NET (فکر کنم 9.2 باشه) هم بدون مشکل این کار رو انجام میدم. نمیدونم مشکل شما از کجاست؟

----------


## کم حوصله

آقای عریضی عزیز دوست ما مشکلش تو vb6 است نه تو vb.net و فکر می کنم این دو محیط تا حدودی با هم فرق کنند  :?:  :?: 
البته من نمی دونم که این جوریه یا نه ولی چون شیما خانم هم که مثل شما .net کار می کنه همین پیشنهاد را داده بود ولی این دوستمون موفق به انجامش نشده بود :oops:

----------


## Abbas Arizi

خب مثال اولی با VB6.0 بود. ضمن این که اونجوریام نیست که من فقط با NET. کار کنم. VB6.0 ویژگیهایی داره که فکر نمیکنم هیچ وقت کسانی که باهاش کار کردن بتونن به طور کامل از اون جدا بشن و من اصلا با کسانی که سعی در کوبیدن اون دارن موافق نیستم. :oops:

----------


## mes

> خب مثال اولی با VB6.0 بود. ضمن این که اونجوریام نیست که من فقط با NET. کار کنم. VB6.0 ویژگیهایی داره که فکر نمیکنم هیچ وقت کسانی که باهاش کار کردن بتونن به طور کامل از اون جدا بشن و من اصلا با کسانی که سعی در کوبیدن اون دارن موافق نیستم. :oops:


عباس جان منو ببخش چون اشتبا نوشتم 9 در صورتی که 9.2 بوده
ببخش :oops: 
عباس جان کمک کن داداش
فهمیدی چی شد
عزیز من همه اون کارا و میکنم ولی وقتی که میاد اون عکس رو نشون نمی ده در صورتی که تو فایلم تو اون رکورد عکس هست اما..
ممنونمیشم اگه بازم با صبر مارو را بندازی

----------


## Abbas Arizi

شما توی DB از چه نوع فیلدی استفاده کردی. ممکنه اون فیلد از نوع سازگار نیست. یعنی توی Access میتونی اون فیلد رو به عنوان یک OLE OBJECT  ببینی یا نه؟ اصلا از بانک Access استفاده میکنی یا چیز دیگه؟

----------


## mes

> شما توی DB از چه نوع فیلدی استفاده کردی. ممکنه اون فیلد از نوع سازگار نیست. یعنی توی Access میتونی اون فیلد رو به عنوان یک OLE OBJECT  ببینی یا نه؟ اصلا از بانک Access استفاده میکنی یا چیز دیگه؟


عباس جان بلی حتی تو فرممم از اون استفاده میکنم و مثلا ثبت نام میکنه و خیره

----------


## Abbas Arizi

متاسفانه من عقلم دیگه به جایی قد نمیده.  :oops: از سایر دوستان تقاضا دارم که به یاری این دوست عزیز بشتابند. من هم روش فکر میکنم بلکه بفهمم گیر کارت کجاست؟
راستی میتونی فایل DB رو با EMail برای من بفرستی؟ البته یه رکورد توش باشه.

----------


## A.Noor

با سلام 

یک راه هست اما چندان جالب نیست 
در کریستال ریپورت می‌توان یک فایل تصویری روی ریپورت قرار داد . اگر این دوستمان 
برایشان مقدور باشد که موقع گزارشگیری برای هربار  فقط یک صفحه به چاپگر ارسال کنند  ( یعنی نخواهند که چند صفحه را در یکبار چاپ به چاپگر ارسال کنند )  برنامه ای هست که تصویر را از دیتابیس بخواند و درون یک فایل تصویری ذخیره کند.

----------


## mes

نور عزیز اصلا نمیشه ازش اسفتاده کرد چون اطلاعات حدود 170 نفر رو باید یه جا چاپ کنه
عباس جان اینم دیتا بیسم که خاسته بودی

----------


## Abbas Arizi

من دیتابیس رو نگاه کردم. چیزی که فهمیدم اینه که مشکل شما در گزارش نیست بلکه در نوع ذخیره سازی تصویره و باید اون رو تغییر بدی.
میتونی بگی الان چه جوری عکسهارو ذخیره میکنی؟

----------


## mes

> من دیتابیس رو نگاه کردم. چیزی که فهمیدم اینه که مشکل شما در گزارش نیست بلکه در نوع ذخیره سازی تصویره و باید اون رو تغییر بدی.
> میتونی بگی الان چه جوری عکسهارو ذخیره میکنی؟


منظورت درست کردن فایل باشه که همون طوری که میبینی با یه او ال ای درست شده فیلدش
اما اگه منظورت ذخیرست یه دونه تو فورمم پیک گذاشتم که با یه دکمه میره و یه تصویر رو میخونه و در file nameاون قرار می ده و  معمولی هم دیتا فیلد و دیتا سورس و اینا رو پر کردم
قربانت
ام.ای.اس :cry:

----------


## Abbas Arizi

ببین اگه برای ذخیره عکس از این تابع استفاده کنی مشکل حل میشه یا نه؟
آرگومان اول مسیر DB ، دوم مسیر تصویر، سوم پرس و جوی رکوردست و آخری نام فبلد تصویر است
Public Function AddPhotoToDb&#40;sDbFile, strPhoto As String, strQuery As String, FieldName&#41;
    Dim intZeroFill As Integer
    Dim lOffset As Long
    Dim lSize As Long
    Dim nHandle As Integer
    Dim lSubChunks As Long
    Dim Chunk&#40;&#41; As Byte
    Dim nFragmentOffset As Integer
    Dim i As Integer
    Dim lChunks As Long
    Dim txtByteCount As Long
    
    Const conChunkSize = 8192
    
    
    Dim daoDB As DAO.Database
    Dim daoRst As DAO.Recordset
    
    Set daoDB = OpenDatabase&#40;sDbFile&#41;
    Set daoRst = daoDB.OpenRecordset&#40;strQuery&#41;
    
    If strPhoto = "" Then Exit Function
    
    With daoRst
       .AddNew
       
       nHandle = FreeFile
       Open strPhoto For Binary Access Read As nHandle
            
       lSize = LOF&#40;nHandle&#41;
       
       If nHandle = 0 Then
         Close nHandle
       End If
        
       lChunks = lSize \ conChunkSize
       nFragmentOffset = lSize Mod conChunkSize
            
       ReDim Chunk&#40;nFragmentOffset&#41;
       
       Get nHandle, , Chunk&#40;&#41;
       daoRst&#40;FieldName&#41;.AppendChunk Chunk&#40;&#41;
       
       ReDim Chunk&#40;conChunkSize&#41;
       
       lOffset = nFragmentOffset
       
       For i = 1 To lChunks
            Get nHandle, , Chunk&#40;&#41;
            daoRst&#40;FieldName&#41;.AppendChunk Chunk&#40;&#41;
            lOffset = lOffset + conChunkSize
            txtByteCount = lOffset
            DoEvents
        Next
            
      .Update
   End With
   
   Close nHandle
   
   daoDB.Close
   
   Set daoDB = Nothing
   Set daoRst = Nothing
End Function

البته این تابع از DAO استفاده میکنه و قبل از استفاده از اون باید DAO 3.51 رو به Refrence های پروژه اضافه کرده باشی.

----------


## Abbas Arizi

این هم همونه با ADO:
Public Function AddPhotoToDb&#40;sDbFile, strPhoto As String, strQuery As String, FieldName&#41;
    Dim intZeroFill As Integer
    Dim lOffset As Long
    Dim lSize As Long
    Dim nHandle As Integer
    Dim lSubChunks As Long
    Dim Chunk&#40;&#41; As Byte
    Dim nFragmentOffset As Integer
    Dim i As Integer
    Dim lChunks As Long
    Dim txtByteCount As Long
    
    Const conChunkSize = 8192
    
    Dim adoCn As ADODB.Connection
    Dim adoRst As ADODB.Recordset
    
    Set adoCn = New ADODB.Connection
    Set adoRst = New ADODB.Recordset
    
    adoCn.Provider = "Microsoft.JET.OLEDB.4.0"
    adoCn.Open sDbFile
    
    adoRst.LockType = adLockOptimistic
    adoRst.Open strQuery, adoCn
    
    With adoRst
       .AddNew
       
       nHandle = FreeFile
       Open strPhoto For Binary Access Read As nHandle
            
       lSize = LOF&#40;nHandle&#41;
       
       If nHandle = 0 Then
         Close nHandle
       End If
        
       lChunks = lSize \ conChunkSize
       nFragmentOffset = lSize Mod conChunkSize
            
       ReDim Chunk&#40;nFragmentOffset&#41;
       
       Get nHandle, , Chunk&#40;&#41;
       adoRst&#40;FieldName&#41;.AppendChunk Chunk&#40;&#41;
       
       ReDim Chunk&#40;conChunkSize&#41;
       
       lOffset = nFragmentOffset
       
       For i = 1 To lChunks
            Get nHandle, , Chunk&#40;&#41;
            adoRst&#40;FieldName&#41;.AppendChunk Chunk&#40;&#41;
            lOffset = lOffset + conChunkSize
            txtByteCount = lOffset
            DoEvents
        Next
            
      .Update
   End With
   
   Close nHandle
   
   adoCn.Close
   
   Set adoCn = Nothing
   Set adoRst = Nothing
End Function

----------


## mes

عزیز خوب من این کارارو با شیئ ها انجام دادم دیگه
ولی چشم امتحان میکنم

----------


## mes

عباس جان فکر نمی کنم از ذخیره عکی باشه عزیز می ونی برام یه مثال با یه دتا بیس ذیگه که درست کار میکنه بفرستی؟ البته شرمنده
ببخش منو چند روزه مزاحمم
یا علی

----------


## Abbas Arizi

این گزارش با Crytal 8.5 هست. نمیدونم با 9.2 تطابق داره یا نه؟ ولی به هرحال اگه بتونید اون رو باز کنید میبیند که عکسی رو که شما وارد کردید نشون نمیده ولی عکسی رو که من با همین روش ذخیره کرده ام نشون میده.

----------


## mes

عباس جان اگه این طور باشه حلش می کن
آق زحمت کشیدین
قربانت
ام.ای.اس
 :wink:

----------


## mes

عباس جان با 9.2 سازگار نیست ولی تو اون دیتا بیسی که شما ذخیره کردی توش چنتا عکس رفتم وبا 9.2 یه ریپورت درس کردم در اون اول در طراحی عکسه میاد و لی در موقع اجرا دریغاز تصویر.
واقعا به خدا روم نمی شه بنویسم
قربانت
ام.ای.اس

----------


## Abbas Arizi

متاسفانه من Crsytal Report 9.2 رو به اون شکلی که شما داری ندارم تا بتونم بگم دقیقا باید چیکار کرد.
توی کدی که من ضمیمه کرده ام روی اون فرم گزارش توی Form_Load من یک کد برای تنظیم DataSource نوشته ام. ببین اون رو میشه روی گزارش پیاده کرد یا نه؟ اگر بتونی اون کار رو بکنی شاید این اشکال برطرف بشه.

----------

