# پایگاه‌های داده > SQL Server > مدیریت دیتابیس (Database Administration) >  آپلود فایلهای حجم بالا در sql server

## mashhadpix

سلام
من می خواهم در sql server 2008 فایلهای با حجم تقریبا 10MB آپلود کنم ولی این کار انجام نمی پذیرد. مقدار datatype مربوط به فیلد را تغییر دادم ولی همچنان درست کار نمی کند و هنگام آپلود سایت بسته میشود.
باید چه کاری انجام بدم که وقتی فایلهایی با حجم بالا آپلود کردم دیگری مشکلی پیش نیاد.
ممنون میشم یکی بتونه منو راهنمایی کنه؟

----------


## aghayex

تا الان این کار انجام ندادم و به شما هم توصیه نمی کنم فایل ها رو در بانک ذخیره کنید

----------


## mashhadpix

> تا الان این کار انجام ندادم و به شما هم توصیه نمی کنم فایل ها رو در بانک ذخیره کنید


منظورم اینه که من یک فایل 1 مگابایتی را در فرم وبم می خواهم آپلود کنم در ویژوال استدیو 2010 مشکلی نداره از این بابت ولی وفتی این فایل به مثلا 10 مگابایت می رسد مشکل پیش میاد و وبسایت بسته میشه.
من با VS2010 و SQl Server 2008 کار می کنم.
فکر کردم از مقدار datatype است که اونم عوض کردم درست نشد.
راه حلش چیست؟

----------


## Reza_Yarahmadi

یعنی چی فرم بسته میشه؟ DataType چیه؟ اگر خطا میده متن خطا چیه؟
مطمئنید مشکل به دیتابیس مربوطه؟

----------


## in_chand_nafar

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

----------


## mashhadpix

> یعنی چی فرم بسته میشه؟ DataType چیه؟ اگر خطا میده متن خطا چیه؟
> مطمئنید مشکل به دیتابیس مربوطه؟


وقتی فایلهای حجم بالا می خواهم تو ویژوال استدیو که به sql server وصل شده آپلود کنم. وقتی دکمه آپلود را می زنم به صورت زیر می شود:
ERORR-page.jpg
مشکل کجاست و باید چه کاری انجام دهم.
ممنون میشم راهنمایی کنید.

----------


## Reza_Yarahmadi

DataType شما چیه؟

----------


## mashhadpix

datatype مربوط به فایلی که می خواهم آپلود کنم: varchar(150) است.
فقط فایلهایی با حجم بالا مشکل دارم.
ممنون میشم راهنمایی کنید.

----------


## Reza_Yarahmadi

برای ذخیره فایل یا از (VarBinary(MAX استفاده کنید یا از FileStream (هر دو موضوع توی سایت بصورت کامل توضیح داده شده)
برای امتحان این موضوع DataType رو به (VarBinary(MAX تغییر بدید . در صورت  درست شدن با توجه به شرایط کاری یکی از روشها رو انتخاب کنید

درصورت استفاده از VarBinary میتونید بصورت Partial (تیکه تیکه) فایل رو ذخیره کنید.

----------


## mashhadpix

> برای ذخیره فایل یا از (VarBinary(MAX استفاده کنید یا از FileStream (هر دو موضوع توی سایت بصورت کامل توضیح داده شده)
> برای امتحان این موضوع DataType رو به (VarBinary(MAX تغییر بدید . در صورت  درست شدن با توجه به شرایط کاری یکی از روشها رو انتخاب کنید
> 
> درصورت استفاده از VarBinary میتونید بصورت Partial (تیکه تیکه) فایل رو ذخیره کنید.


چرا باید به صورت باینری باشد، مگه به صورت varchar باشه استفاده نمیشه کرد؟
یه کم جستجو کردم به اون چیزی که میخاستم نرسیدم. همه گفتن یه کاری رو انجام بدم ولی با فایلهای با حجم بالا باید چیکار کنم؟
ممنون میشم راهنمایی بفرمایید.

----------


## Reza_Yarahmadi

> چرا باید به صورت باینری باشد، مگه به صورت varchar باشه استفاده نمیشه کرد؟


VarChar واسه داده های رشته ای (متون لاتین) کاربرد داره.(که برای متون فارسی باید از NVarChar استفاده کرد)
شما دارید میگید فایل ؛ فایلها را باید بصورت باینری ذخیره کرد نه رشته ای!
10MB خیلی حجیم به حساب نمیاد. (VarBinary(MAX قابلیت ذخیره فایلهای 2GB رو داره و اگه از قابلیت FileTable استفاده کنید که تا حجم درایو انتخابی میتونید فایل ذخیره کنید.(این قابلیت در SQL Server 2012 ارائه شده)

----------


## mashhadpix

> VarChar واسه داده های رشته ای (متون لاتین) کاربرد داره.(که برای متون فارسی باید از NVarChar استفاده کرد)
> شما دارید میگید فایل ؛ فایلها را باید بصورت باینری ذخیره کرد نه رشته ای!
> 10MB خیلی حجیم به حساب نمیاد. (VarBinary(MAX قابلیت ذخیره فایلهای 2GB رو داره و اگه از قابلیت FileTable استفاده کنید که تا حجم درایو انتخابی میتونید فایل ذخیره کنید.(این قابلیت در SQL Server 2012 ارائه شده)


حالا من می خواهم در sql server 2008 فایلهای حداکثر 100mb بتونند آپلود کنند. راهنمایی کامل؟



> درصورت استفاده از VarBinary میتونید بصورت Partial (تیکه تیکه) فایل رو ذخیره کنید.


یعنی چی تیکه تیکه؟
ممنون میشم راهنمایی کنید.

----------


## Reza_Yarahmadi

> حالا من می خواهم در sql server 2008 فایلهای حداکثر 100mb بتونند آپلود کنند. راهنمایی کامل؟


 خدمتتون عرض کردم (VarBinary(MAX تا 2GB قابلیت ذخیره سازی اطلاعات داره،  اگر حجم اکثر فایلهای شما به 256KB نمیرسه از همون (VarBinary(MAX بصورت  معمول استفاده کنید ولی اگه بیشتره بهتر اینه که از FileStream استفاده  کنید.

 اگه از نوع داده (VarBinary(MAX استفاده کنید (FileStream این قابلیت رو  نداره) میتونید فایل رو بصورت پارت پارت ذخیره کنید. به این صورت که پارت  اول رو با دستور Insert ذخیره و پارت های بعدی با دستور Update به فیلد  مورد نظر اضافه میکنید. برای دستور Update بصورت زیر میشه عمل کرد
Update YourTable Set BinaryField.Write(@BinaryData, @Offset, @Length) Where ID = @ID
 توی این حالت :
 اگه وسط کار ارتباط قطع بشه میشه بعد از وصل مجدد عملیات ادامه پیدا کنه.
 در وب میشه با استفاده از Ajax علاوه بر ذخیره سازی پارت پارت ، با استفاده از یک ProgressBar پیشرفت رو به کاربر نشون داد.

----------


## mashhadpix

> خدمتتون عرض کردم (VarBinary(MAX تا 2GB قابلیت ذخیره سازی اطلاعات داره،  اگر حجم اکثر فایلهای شما به 256KB نمیرسه از همون (VarBinary(MAX بصورت  معمول استفاده کنید ولی اگه بیشتره بهتر اینه که از FileStream استفاده  کنید.
> 
>  اگه از نوع داده (VarBinary(MAX استفاده کنید (FileStream این قابلیت رو  نداره) میتونید فایل رو بصورت پارت پارت ذخیره کنید. به این صورت که پارت  اول رو با دستور Insert ذخیره و پارت های بعدی با دستور Update به فیلد  مورد نظر اضافه میکنید. برای دستور Update بصورت زیر میشه عمل کرد
> Update YourTable Set BinaryField.Write(@BinaryData, @Offset, @Length) Where ID = @ID
>  توی این حالت :
>  اگه وسط کار ارتباط قطع بشه میشه بعد از وصل مجدد عملیات ادامه پیدا کنه.
>  در وب میشه با استفاده از Ajax علاوه بر ذخیره سازی پارت پارت ، با استفاده از یک ProgressBar پیشرفت رو به کاربر نشون داد.


مدیر این بخش خواهشن راهنمایی بفرمایید، شاید من اشتباه انجام میدهم ولی در هر صورت درست اجرا نمیشه.
شما می فرمایید پارت به پارت، یادم رفت بگم فایلها معمولا pdf هستن.
بعدش شما می فرمایید: 


> VarChar واسه داده های رشته ای (متون لاتین) کاربرد داره.


فایل می خواهم آپلود کنم متن که نیست انگلیسی باشه یا فارسی.
من این کدی که گفته بودید برای update نوشتم بازم کار نکرد:
  "Update Articles Set BinaryField.Write ArticleTitle=@ArticleTitle,ArticleText=@ArticleTex  t,ArticleImage=@ArticleImage,FileName=@FileName Where ArticleID=" +
ID;


 از این اصلا نمی خواهم استفاده کنم چون لازم ندارم: 


> با استفاده از یک ProgressBar پیشرفت رو به کاربر نشون داد.


در ضمن نوع داده را به (VarBinary(MAX تغییر می دهم اصلا کلان خطا میگیره و پیغام خطا :
*Implicit conversion from data type nvarchar to varbinary(max) is not allowed. Use the CONVERT function to run this query*

پیغام خطا میگه که باید تبدیل بشه.

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

----------


## Reza_Yarahmadi

> شما می فرمایید پارت به پارت، یادم رفت بگم فایلها معمولا pdf هستن.


شما میخواید بایت ذخیره کنید؛ به فرمت فایل وابسته نیست.
توضیح من در مورد VarChar بدلیل استفاده شما از این نوع بود.و توضیح هم دادم که توی فیلد میتونید String ذخیره کنید نه فایل!!



> من این کدی که گفته بودید برای update نوشتم بازم کار نکرد:


کد رو اشتباه نوشتید، به نظرم اگه بیخیال Partial Insert بشید بهتره.



> در ضمن نوع داده را به (VarBinary(MAX تغییر می دهم اصلا کلان خطا میگیره و پیغام خطا :
> *Implicit conversion from data type nvarchar to varbinary(max) is not allowed. Use the CONVERT function to run this query*



نوع داده NvarChar رو نمیتونید همینطوری به VarBinary تبدیل کنید. اول باید یه فیلد جدید درست کنید بعد معادل Binary فیلد Nvarchar رو توی فیلد جدید بریزید و سپس فیلد قبلی رو حذف کنید.
برای این کار دستور زیر رو روی SQL Server اجرا کنید
Alter Table YourTable
Add NewColumn varbinary(MAX) -- null or not null ...

GO

Update YourTable
Set NewColumn = Cast(YourFieldName as varbinary(MAX))

GO

Alter Table  YourTable
Drop Column YourFieldName 

GO

exec sp_rename 'YourTable.NewColumn', 'YourFieldName'

GO



> اگر از این طریق نمیشه، ممنون میشم از طریق FileStream خودتون توضیح بفرمایید. تو انجمن چیزی پیدا نکردم.


توی اینترنت جستجو کنید
http://www.dotnettips.info/post/331
بهتر اینه که مطلب زیر رو هم بخونید (هر چند در مورد SQL Server 2012 است)
http://www.dotnettips.info/post/1307

----------


## mashhadpix

سلام به همگی
راه حلش را خودم پیدا کردم این همه هم راه نمی خواهد برویم.
یک کد ساده است که در web.config پروژه نوشته می شود وقایلهای یه کم با حجم بالا مثلا 10 مگابایت را هم آپلود می کنیم بدون مشکل.
 <httpRuntime executionTimeout="1200" maxRequestLength="400000" /> 
این همه هم مکافات نمی خاد بکشیم و یکی نبود این جوابو بهم بده. :چشمک:

----------

