# Native Code > برنامه نویسی در 6 VB > مطالب مرتبط با بانکهای اطلاعاتی در VB6 >  آموزش ذخیره فایل pdf در بانک اطلاعاتی اکسس

## ahp_online

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

----------


## محسن واژدی

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

 Private Sub Command1_Click()

    Dim bytDByte() As Byte

    Dim sFl$

    sFl$ = App.Path & "\mpdf.pdf"
 

    Open sFl$ For Binary Access Read As #1

    ReDim bytDByte(LOF(1))

    Get #1, , bytDByte()

    Adodc1.Recordset.AddNew

    Adodc1.Recordset.Fields("obj").Value = bytDByte

    Close

End Sub


* و برای بازیابی آن از بانک:*

Private Sub Command2_Click()

    Dim bytDByte() As Byte

    Dim sFl$

    sFl$ = App.Path & "\extpdf.pdf"

    Open sFl$ For Binary Access Read Write As #1

    bytDByte = Adodc1.Recordset.Fields("obj").Value

    Put #1, , bytDByte

    Close

End Sub


موفق باشید

----------


## ahp_online

سلام
ممنون از جواب خوبتون ولی میشه در مورد خطوط برنامه یک توضیح مختصر بدید؟؟ فیلدی که برای فایل PDF نوعش باید چی باشه؟؟ اینطور که من فهمیدم این سورس نام فایل رو در بانک ذخیره می کنه و فایل باید در کنار بانک باشه که وقتی نام بانک خونده میشه فایل رو باز کنه؟؟
ممنون

----------


## محسن واژدی

> در مورد خطوط برنامه یک توضیح مختصر بدید؟؟


 Dim bytDByte() As Byte آرایه ای از نوع بایت اعلان می کنیم 

 Open sFl$ For Binary Access Read As #1 فایل را برای خواندن باز میکنیم 

ReDim bytDByte(LOF(1)) فضای بافری را برای آرایه به اندازه طول فایل در نظر میگیریم 

Get #1, , bytDByte() فایل را در آرایه می ریزیم 

 Adodc1.Recordset.AddNew 
Adodc1.Recordset.Fields("obj").Value = bytDByte  رکورد جدیدی ایجاد و آرایه را در بانک ذخیره میکنیم، obj نام نمونه فیلد مورد نظر است که بایستی با نام جدید جایگزین شود 

 bytDByte = Adodc1.Recordset.Fields("obj").Value محتویات فیلد مشخص شده را در آرایه میریزیم 

Put #1, , bytDByte  داده ها را در فایل باز شده میریزیم 




> فیلدی که برای فایل PDF نوعش باید چی باشه؟؟


 باید از نوع OLE باشد، برای ذخیره داده های باینری 




> اینطور که من فهمیدم این سورس نام فایل رو در بانک ذخیره می کنه و فایل باید در کنار بانک باشه که وقتی نام بانک خونده میشه فایل رو باز کنه؟؟


 فایل کامل در بانک ذخیره میشود، برای ذخیره فقط مسیر فایل دو خط دستوری مانند زیر کافی است:  Private Sub Command1_Click() 
Adodc1.Recordset.AddNew   
Adodc1.Recordset.Fields("obj").Value = "C:\mpdf.pdf"   
End Sub  

موفق باشید

----------


## ahp_online

سلام
یک سوال دیگه هم داشتم: من چطوری می تونم یک فایل PDF را در نرم افزار Attach کنم؟؟ میشه اینم توضیح بدید؟آخه شما در برنامه فایل Mpdf را به صورت نرم افزاری Atach کردید! حالا من می خوام وقتی دارم اطلاعات رو در نرم افزار وارد می کنم خودم فایل PDF رو همونجا Attach نرم افزار کنم؟؟
تشکر

----------


## محسن واژدی

سلام علیکم
اگر منظورتون افزودن فایل به ریسورس است، تنها در زمان طراحی میتوانیم اینکار را انجام دهیم، کد بالا فایل را به دیتابیس ضمیمه میکند 

موفق باشید

----------


## ali190

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

----------


## محسن واژدی

> سلام خدمت همه عزیزان
> محسن جان ممنونم از توضیحاتت
> امکانش هست که پروسه دانلود آپلود فایل در دیتابیس رو با پروسزبار نمایش بدیم؟
> ممنونم
> یاعلی


سلام علیکم
بله با AppendChunk و GetChunk در Adodc1.Recordset.Fields(&quot;filedname&quot;) 
به عبارت بهتر در هربار قسمتی از فایل را وارد و توسط این دو روال به بانک اضافه یا استخراج میکنیم، در این بین میزان بایت باقیمانده را در progress-bar نمایش میدهیم

----------


## ali190

سلام
ممنون از توضیحاتت
امکانش هست این دو قسمت (یعنی نمایش میزان دانلود و آپلود رو در پروسزبار) رو نمایش بدی؟
ممنونم
یاعلی

----------


## ahp_online

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

----------


## محسن واژدی

> من برنامه Attach کردن فایل توسط نرم افزار رو نوشتم وو قتی یک فایل رو attach میکنی یک کپی در یک فولدر کنار فایل برنامه می سازه و اونجا کپی می کنه و بعد نام فایل PDF را در بانک ذخیره می کنه(خاصیت فیلد هم Text می باشد).حالا سوالم اینه که وقتی اسم فایل رو از بانک می خونم چجوری میشه فایل رو باز کرد؟؟؟
> این روش هم کسی بلده به؟؟؟


سلام علیکم
اگر در کدی که در پست های قبل دادم استفاده میکنید، آیا نام فایلی که در کنار برنامه ایجاد میشود mpdf.pdf است؟؟، اگر اینطور است خب بایستی ابتدا مسیر فایل مورد نظرتان را جایگزین مسیر نمونه موجود در متغیر sFl کنید چراکه مسیر فعلی فقط یک نمونه است و اینکه فایلی در کنار برنامه ایجاد میشود به این دلیل است که چون فایلی با این نام در کنار برنامه وجود ندارد Open یک فایل با نام mpdf در کنار برنامه ایجاد میکند و اگر فضای آنرا را بررسی کنید 0 است
همچنین اگر قصد دارید دارید فایلی را به بانک ضمیمه کنید حتما بایستی نوع فیلد از نوع OLE-Object باشد برای ذخیره محتوی باینری، چرا که نوع Text محتوی رشته ای را نگهداری میکند 

موفق باشید

----------


## محسن واژدی

> سلام ممنون از توضیحاتت امکانش هست این دو قسمت (یعنی نمایش میزان دانلود و آپلود رو در پروسزبار) رو نمایش بدی؟ ممنونم یاعلی


 سلام علیکم 
خواهش میکنم 
نمونه زیر را بررسی کنید 

موفق باشید

----------


## ali190

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

----------


## محسن واژدی

> میزان زمانی که در هنگام آپلود طول میکشه تا فایل در دیتابیس آپدیت بشه در پروسزبار نشون داده نمیشه اونم میشه کاریش کرد؟


 سلام علیکم 
حسابش نکرده ام

----------


## ali190

پس این قسمت (یعنی زمان صرف شده جهت آپدیت شدن رکورد قابل محاسبه نیست) قابل محاسبه کردن نیست
درسته؟

----------


## محسن واژدی

> پس این قسمت (یعنی زمان صرف شده جهت آپدیت شدن رکورد قابل محاسبه نیست) قابل محاسبه کردن نیست
> درسته؟


 سلام
در مورد زمان سپری شده چرا مشکلی نیست اما تخمین زمان باقیمانده را اتمام آپلود/دانلود کمی وقت می خواهد

----------


## ali190

یعنی میشه زمان آپدیت شدن رکورد رو در زمان آپلود شدن فایل رو هم به پروسزبار افزود
چون در نمونه قبلی همونطور که میبینید وقتی پروسزبار به پایان میرسه چند ثانیه طول میکشه تا رکورد آپدیت بشه
این موضوع در مورد فایلهای حجیم تر محسوستره
مثلاً شما یک فیم 180 مگی رو آپلود کنید ، حودون متوجه موضوع میشید
من میخوام از این روش در دیتابیس SqlServer استفاده کنم

----------


## محسن واژدی

> یعنی میشه زمان آپدیت شدن رکورد رو در زمان آپلود شدن فایل رو هم به پروسزبار افزود
> ...


با عرض معذرت زیاد متوجه منظورتان نشدم، در صورت امکان کمی بیشتر توضیح بدین! 
تا آنجایی که بنده متوجه شدم، برای بدست آوردن زمان سپری شده میتوانیم یکبار پیش از شروع عملیات با توابعی مانند apiی GetTickCount مقدار ثانیه را ذخیره و پس از انجام عملیات مجدد مقدار ثانیه موجود را بدست آورده که در اینصورت اختلاف این دو زمان میشود زمان سپری شده ما!

----------


## ali190

سلام
ممنونم از پیگیریتون
ببیند هسته اصلی کد آپلود کردن در اینجاست:
    Do
        If bExit Then Exit Do
        If (lFL& - Seek(iFF%)) < lBytes& Then ReDim bytDByte(lFL& - Seek(iFF%))
        Get #1, , bytDByte
        Adodc2.Recordset.Fields("xfile").AppendChunk bytDByte
        lCurProg& = lCurProg& + 1
        ProgressBar1.Value = lCurProg&
        Caption = lCurProg& & "/" & lSplit& & " - " & (lFL& - Seek(iFF%)) & "/" & lFL& & " - Max bytDByte:" & UBound(bytDByte)
        DoEvents
    Loop Until EOF(iFF%) Or Seek(iFF%) >= lFL&
    Adodc2.Recordset.UpdateBatch
    Close iFF%
    MsgBox "Uploading Completed...", vbInformation

حال این کد رو به دو بخش تقسیم میکنیم:
بخش اول که در این قسمت عملیات با پروسزبار نمایش داده میشود:
    Do
        If bExit Then Exit Do
        If (lFL& - Seek(iFF%)) < lBytes& Then ReDim bytDByte(lFL& - Seek(iFF%))
        Get #1, , bytDByte
        Adodc2.Recordset.Fields("xfile").AppendChunk bytDByte
        lCurProg& = lCurProg& + 1
        ProgressBar1.Value = lCurProg&
        Caption = lCurProg& & "/" & lSplit& & " - " & (lFL& - Seek(iFF%)) & "/" & lFL& & " - Max bytDByte:" & UBound(bytDByte)
        DoEvents

اما در بخش دوم ما باید رکورد مورد نظر رو در دیتابیس Update کنیم
  Loop Until EOF(iFF%) Or Seek(iFF%) >= lFL&
    Adodc2.Recordset.UpdateBatch
    Close iFF%
    MsgBox "Uploading Completed...", vbInformation
این بخش از کد بهیچ وجه در پروسزبار به نمایش در نمیاد
شما وقتی این عملیات رو با یه فایل مثلاً 200 مگابایتی انجام میدید میبینید که بعد از این پروسزبار به انتها رسید حدوداً 14 ثانیه زمان بروزرسانی طول میکشه
که این زمان بسته به حجم فایل بیشتر هم میشه
امیدوارم تونسته باشم منظورم رو برسونم
بازهم ممنونم
یاعلی

----------


## محسن واژدی

سلام علیکم
مجددا ضمیمه قبلی را بررسی کنید، انشاء الله درسته 

موفق باشید

----------


## meysam34797

این همه نوشتید اگر از همون اول یه نمونه میزاشتید نیاز به اینهمه نامه نگاری نبود :بوس:

----------


## vbhamed

سلام
دوست عزیز اینجا سایت آموزشی است نه ماهیگیری !

----------

