PDA

View Full Version : حرفه ای: سورس:ذخیره و بازیابی فایل در SQL Server و Access با درصد پیشرفت(دانلود کنید!)



فرید نجفلو
پنج شنبه 03 فروردین 1391, 20:38 عصر
سلام خدمت دوستان:
یک نمونه سورس جهت ذخیره و بازیابی فایل ها با امکانات زیر می ذارم امید وارم برای دوستان مفید واقع بشه:
1-ذخیره و بازیابی فایل از هر دو پایگاه داده SQL Server و اکسس(JET 4.0)
(اجرای کامل با SQL Server 2008 و بالاتر)
2-درصد پیشرفت ذخیره و بازیابی
(نکته:درصد پیشرفت برای بازیابی از دیتابیس اکسس غیر فعال خواهد بود!)
3-قابلیت سوئیچ بین دو نوع پایگاه داده در یک فرم!
(فقط با یک کمبو باکس بین دو پایگاه داده سوئیچ انجام می شه!)
4-ایجاد RunTime هر دو پایگاه داده
اینم تصویر:


84555



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


دانلود کنید:



منتظر نظرات ، انتقادات و پیشنهادتن شما هستم

84566


تاپیک های مرتبط:


سورس:ذخیره ، بازیابی و چاپ عکس در پایگاه داده(دانلود کنید!) (http://barnamenevis.org/showthread.php?333127-سورس-ذخیره-،-بازیابی-و-چاپ-عکس-در-پایگاه-داده(دانلود-کنید!))
پشتیبان گیری و بازیابی(بدون دستورات SQL ، درصد پیشرفت و...) (http://barnamenevis.org/showthread.php?327660-پشتیبان-گیری-و-بازیابی(بدون-دستورات-SQL-،-درصد-پیشرفت-و...))
س.رس:ProgressBar(درصد پیشرفت کار) در پشتیبان گیری SQl Server بدون استفاده از SMO (http://barnamenevis.org/showthread.php?331999-س.رس-ProgressBar(درصد-پیشرفت-کار)-در-پشتیبان-گیری-SQl-Server-بدون-استفاده-از-SMO)


http://barnamenevis.org/images/misc/pencil.png
http://barnamenevis.org/images/misc/pencil.png

ali190
پنج شنبه 03 فروردین 1391, 22:43 عصر
سلام
برنامه با دیتابیس اکسس درست کار میکنه ولی در SQL Server خطای زیر رو میده:
عدم توانایی در ذخیره فایل در پایگاه داده Incorect Syntext '+'

فرید نجفلو
پنج شنبه 03 فروردین 1391, 23:59 عصر
سلام
برنامه با دیتابیس اکسس درست کار میکنه ولی در SQL Server خطای زیر رو میده:
عدم توانایی در ذخیره فایل در پایگاه داده Incorect Syntext '+'

سلام
اولا از توجه تون ممنون
ولی من باز به خاطر شما تست کردم مشکلی که میگید رو ندیدم فقط یه مورد بود اینکه یه جا کانکشن رو نبسته بودم که اونم اصلاح شد اگه خواستید دوباره دانلود کنید یا خودتون اصلاح کنید(انتهای متد StoreFileInDB یک Finally اضافه کنید داخلش بنویسید CloseConn(GlobalConnection))
اگه لطف کنید دقیق تر نگاه کنید ممنون می شم سورس هم که خدمتتون هست
واسه اینکه راحت تر کنید من فقط تو یه تابع (Functions.SaveFileIntoDB) از + استفاده کردم و یه بریک پوینت هم تو SqlRunCmd بذارید!

ali190
جمعه 04 فروردین 1391, 01:05 صبح
سلام
باز هم همون خطا رو میده
http://img4up.com/up2/03269511047805583661.jpg

ali190
جمعه 04 فروردین 1391, 01:23 صبح
راستی یه نکته ای رو کتوجه شدم
زمانیکه فایلهای کوچیک رو ذخیره میکنی مشکل نداره
مثلاً من الان یک عکس 124 KB رو ریختم مشکلی نداشت
ولی وقتی مثلاً میخوای یه MP3 برزی به مشکل میخوری
امتحان کنید
ممنونم
یاعلی

فرید نجفلو
جمعه 04 فروردین 1391, 01:30 صبح
همون طور که گفتم اصلاحات در مورد خطای شما نبود!
برنامه رو اجرا کنید تو تابع Functions.SaveFileIntoDB تو خطی که sqlRunCmd رو صدا زدم یه بریک پوینت بذارید حالا دکمه "ذخیره فایل در پایگاه داده" رو بزنید وقتی اجرا بریک شد مقدار متغیر TSQL رو نگاه کنید(مثلا با Shift+F9) و بگید
واینکه شما فقط با یه فایل که تست نمی کنید.فایل ها با پسوند هاو مسیر های متفاوت رو امتحان کنید
راستی با اینکه فکر نکنم تاثیر کذار باشه ولی میشه بگید نسخه SQL Server شما چنده؟

هر موردی بود منم در جریان بذارید ممنون

ali190
جمعه 04 فروردین 1391, 01:48 صبح
نسخه SQL من SQL Server 2005 نسخه Express هست
راستی دوباره تست کردم
فایل با تا حجم 1 مگابایت رو بدون مشکل آپلود میکنه
ولی بیشتر رو نه!

فرید نجفلو
جمعه 04 فروردین 1391, 14:26 عصر
نسخه SQL من SQL Server 2005 نسخه Express هست
راستی دوباره تست کردم
فایل با تا حجم 1 مگابایت رو بدون مشکل آپلود میکنه
ولی بیشتر رو نه!

بله حق باشماست!
ولی تقصیر من هم نیست!
همین الان با 2005 تست کردم با همون خطا مواجه شدم!
چون من خودم با 2008 نسخه Express نوشتم خطلایی ندیدم پس در این صورت جهت استفاده باید نسخه SQL رو عوض کنید(حالا چرا 2005 استفاده می کنید دیگه نسخه 2012 که اومده!)
(من هر توضیحی بدم مربوط به 2008 خواهد بود)
در مورد یک 1 مگابایت هم که طبق تصویر من خودم یک 4MB رو ذخیره کردم ولی دیگه فکر نکنم تا این حد باشه
حدکثر حجم فایل شما برای ذخیره در SQL برابر است با :
2^31-1
یعنی چیزی حدود 2GB که این تفاوت با 1MB سر به فلک می زنه!
البته من یک احتمال می دم مشکل باز از 2005 بودنه
چون من به صورت پیش فرض هر عملیات ذخیره و بازیابی رو جهت تعادل بین کارایی و جلوه های نمایش بین 1MB تا 20MB محدود کردم!(البته شما می تونید با تغییر دو خط در قسمت جنرال کلاس فرم تغییرش بدید و سایر تنظیمات نیز همون جا هستن)

پس طبق گفته بالا برنامه برای هر فایل تا حجم 1MB از عملگر = استفاده خواهد کرد اما وقتی حجم بیشتر از این شد چون تعداد نوشتن ها بیشتر از یک بار می شه (همون خاصیتی که درصد پیشرفت رو قابل نمایش می کنه) به صورت هوشمند در بار اول از = و بعد از اون =+ رو استفاده می کنه و مشکل همین جاست که 2005 از =+ پشتیبانی نمی کنه!

در ضمن یه نکته رو هم اینجا باید بهتون بکم که مهمه:
اگه دقت کرده باشد من من دیگه از نوع فیلد Image استفاده نکردم و شما هم دیگه استفاده نکنید!
چون از نسخه 2012 این نوع داده از SQL Server حذف شد و تاکید بر استفاده از نوع VarBinary(Max) داره!

ali190
جمعه 04 فروردین 1391, 14:44 عصر
سلام
ممنون از توضیحاتتون
امکانش هست تغییراتی رو که فرمدین در سورس اعمال بفرمائید تا در SQL 2005 هم قابلیت استفاده داشته باشه
ممنونم
یاعلی

فرید نجفلو
جمعه 04 فروردین 1391, 15:08 عصر
سلام
ممنون از توضیحاتتون
امکانش هست تغییراتی رو که فرمدین در سورس اعمال بفرمائید تا در SQL 2005 هم قابلیت استفاده داشته باشه
ممنونم
یاعلی

من نگفتم تغییراتی ایجاد کرم !
اصلا نمی تونم ایجاد کنم چون من چطور تغییر بدم که در حالی که پشتیبانی نمی کنه!

اگر هم می خواهید از درصد پیشرفت صرف نظر کنید در کد های فرم این دو خط رو :

Private Const MinBlockSize = OneMB
Private Const MaxBlockSize = OneMB * 5 '5MB


با این کد ها جایگزین کنید :

Private Const MinBlockSize = (2 ^ 31) - 1 '~2GB
Private Const MaxBlockSize = (2 ^ 31) - 1 '~2GB

خطوط اصلی رو به صورت کامنت شده نگه دارید تا در صورت تغییر نسخه SQL بتونید دوباره ازش استفاده کنید!

من هم نمی تونم این تغییرات رو در پروژه اصلی ایجاد کنم چون اون وقت حق دوستانی که از 2008 و بالاتر استفاده می کنن تضییع می شه؟
باز هم از اینکه به من کمک می کنید تا چیزهی بیشتری یاد بگیرم ازتون بسیار تشکر می کنم:تشویق::قلب:

suncity
دوشنبه 16 بهمن 1391, 22:30 عصر
سلام.
دست شما درد نکنه خیلی مفید هست.
ولی من کلا گیج شدم، من یه تابع میخوام یه فایل بگیره و ذخیره کنه.
و یک تابع برا دانلودش توی asp
ممکنه کمکم کنید؟ هرچی فایل رو خوندم چیزی دستگیرم نشد

فرید نجفلو
سه شنبه 17 بهمن 1391, 03:48 صبح
سلام
اگه تجربه تون کم باشه حق دارید متوجه نشید
همین اول اومدید ذخیره تدریجی (چند مرحله ای) فایل اونم با قابلیت سوئیچ بین دو نوع دیتابیس متفاوت رو خوندید !

این یه نمونه خیلی ساده:

Private Sub InsertWithFile(FilePath As String)

Dim DataBuffer = IO.File.ReadAllBytes(FilePath)
Dim FileName = IO.Path.GetFileName(FilePath)

Dim Cmd As New SqlClient.SqlCommand

Cmd.CommandText = "INSERT INTO [Table1] ([FileName],[FileData]) VALUES (@FileName,@FileData)"
Cmd.Parameters.AddWithValue("@FileName", FileName)
Cmd.Parameters.AddWithValue("@FileData", DataBuffer)

Using Conn As New SqlClient.SqlConnection("Data Source=.;Initial Catalog=TestDb;Integrated Security=True")
Cmd.Connection = Conn
Conn.Open()
Cmd.ExecuteNonQuery()
Conn.Close()
End Using
End Sub

Private Function GetFileFromDB(FileID As Integer) As Byte()

Dim Cmd As New SqlClient.SqlCommand
Cmd.CommandText = "SELECT [FileName] FROM [Table1] WHERE ID =" & FileID

Using Conn As New SqlClient.SqlConnection("Data Source=.;Initial Catalog=TestDb;Integrated Security=True")
Cmd.Connection = Conn
Conn.Open()
Dim Result = CType(Cmd.ExecuteScalar(), Byte())
Conn.Close()
Return Result
End Using
End Function

Private Sub LoadPicFromDb()
Dim FileData = GetFileFromDB(1)
Dim MS As New IO.MemoryStream(FileData)
PictureBox1.Image = Image.FromStream(MS)
End Sub




در ضمن دوستانی که می خوان از پروژه پست اول استفاده کنن می تونن تابع SaveFileIntoDB رو به صورت زیر تغییر بدن (خطوط ابتدایی) تا برای SQL Server بشه از 2005 استفاده کرد و هم سرعت ذخیره سای رو بالاتر ببرن

Try

Dim UpdOperator As String = "= @image"
If Append Then
If GetConnectionType() = ConnectionType.SQlServer Then
UpdOperator = ".WRITE(@image,NULL,NULL)"
ElseIf GetConnectionType() = ConnectionType.Access Then
UpdOperator = " = " & ColumnToStore & " + @image"
End If
End If

Dim TSQL As String = ""
TSQL = ""
TSQL &= String.Format("Update {0} SET {1}{2}", Table, ColumnToStore, UpdOperator) & vbNewLine