ايران ويج

نسخه‌ی کامل: مشکل در ذخیره عکس به صورت دستی
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
سلام
من کد زیر نوشتم

کد:
CREATE PROCEDURE AddToPicture(@ID int, @TitleImage nvarchar(300), @Image varbinary(MAX)) AS
Begin
 Begin Try
   BEGIN TRANSACTION
     
          INSERT INTO TImage
              (
                IID, ITitleImage, IImage
              )
          VALUES
              (
                @ID, @TitleImage, @Image  
              )
          COMMIT
 
 End Try
 Begin CATCH
   IF @@TRANCOUNT > 0
     ROLLBACK
 End CATCH
End


حالا چطوری میتونم از این کد استفاده کنم و یک عکس ذخیره کنم؟؟؟؟ من کد زیر نوشتم ولی کار نمیکنه!!!!!!!!


کد:
EXEC  AddToPicture 1,'Book',D:\12.jpg

لطفا اگه کسی میتونه راهنمایی کنه ممنون میشم اینکار را انجام بده.

با تشکر.
همون طور که خودت نوشتی، آخرین آرگومان Stored Procedure شما، از نوع باینری هست.
پس چرا وقتی میخواستی SP رو کال کنی، تو آرگومان آخر صرفاً آدرس فایل رو دادی؟؟ باید خود فایل رو به صورت باینری باز کنی و به SP بدی.
میشه لطفا راهنمایی کنید باید به چه صورتی بنویسم؟؟؟

هر کاری می کنم درست نمیشه؟؟؟؟

لطفا اگه امکانش هست خواهش می کنم کمک کنید.

با تشکر.
دوستان میشه راهنمایی کنید که چرا کد شماره یک به درستی اجراء میشه ولی کد شماره دو پیغام خطا میده؟؟؟؟

در کد شماره دو فقط آدرس عکس را می خواهم به صورت یک متغییر بدم ولی قبول نمیکنه!!!! اما اگه آدرس عکس ثابت بنویسم مثل کد یک به درستی اجرا میشه؟؟؟؟!!!

لطفا در این مورد راهنمایی کنید.


کد:
-- Code 1

CREATE PROCEDURE AddToPicture(@ID int, @TitleImage nvarchar(300), @PathFile nvarchar(500)) AS
Begin
Begin Try
  BEGIN TRANSACTION

       Insert Into TImage(IID, ITitleImage, IImage)       -- IImage varbinary(MAX)
       Select @ID, @TitleImage, BulkColumn
       from Openrowset (Bulk  'D:\12.jpg', Single_Blob) as Image

       COMMIT

End Try
Begin CATCH
  IF @@TRANCOUNT > 0
    ROLLBACK
End CATCH
End


-

کد:
-- Code 2

CREATE PROCEDURE AddToPicture(@ID int, @TitleImage nvarchar(300), @PathFile nvarchar(500)) AS
Begin
Begin Try
  BEGIN TRANSACTION

       Insert Into TImage(IID, ITitleImage, IImage)       -- IImage varbinary(MAX)
       Select @ID, @TitleImage, BulkColumn
       from Openrowset (Bulk  @PathFile, Single_Blob) as Image

       COMMIT

End Try
Begin CATCH
  IF @@TRANCOUNT > 0
    ROLLBACK
End CATCH
End
اینم تمام چیزی که بهش احتیاج داری:
کد:
            DECLARE @q nvarchar(MAX);
            SET @q= 'INSERT INTO TImage(IID, ITitleImage, IImage) SELECT ' + @ImageID + ',' + CHAR(39) + @ImageTitle + CHAR(39) + ' , BulkColumn FROM Openrowset( Bulk ' + CHAR(39) + @ImagePath + CHAR(39) + ', Single_Blob) as img'
            EXEC(@q)
من این کد اینطوری نوشتم ولی پیغام خطا میده؟؟؟؟؟؟؟؟؟؟!!!!!!!!!!!!

کد:
CREATE PROCEDURE AddToPic(@ImageID int, @ImageTitle nvarchar(300), @ImagePath nvarchar(500)) AS
Begin
    DECLARE @q nvarchar(MAX);
    SET @q= 'INSERT INTO TImage(IID, ITitleImage, IImage) SELECT ' + @ImageID + ',' + CHAR(39) + @ImageTitle + CHAR(39) + ' , BulkColumn FROM Openrowset( Bulk ' + CHAR(39) + @ImagePath + CHAR(39) + ', Single_Blob) as img'
    EXEC(@q)
End

کد:
EXEC AddToPic 2, 'Book', 'D:\12.jpg'


پیغام خطای زیر میده؟

کد:
Msg 245, Level 16, State 1, Procedure AddToPic, Line 5
Conversion failed when converting the varchar value 'INSERT INTO TImage(IID, ITitleImage, IImage) SELECT ' to data type int.
مشکل از اینجاست که @ImageID از نوع Int تعریف شده، پس با CAST کردن نوعش همه چیز حل میشه.

SP شما به این صورت باید نوشته بشه:
کد:
CREATE PROCEDURE AddToPic(@ImageID int, @ImageTitle nvarchar(300), @ImagePath nvarchar(500)) AS
Begin
   DECLARE @q nvarchar(MAX);
   SET @q= 'INSERT INTO TImage(IID, ITitleImage, IImage) SELECT ' + CAST(@ImageID AS varchar(max)) + ',' + CHAR(39) + @ImageTitle + CHAR(39) + ' , BulkColumn FROM Openrowset( Bulk ' + CHAR(39) + @ImagePath + CHAR(39) + ', Single_Blob) as img'
   EXEC(@q)
End
سلام جناب [b]far_222000 [/b]

به نظر شما اینکه عکس را کامل داخل دیتابیس ذخیره کنیم کار درستیه؟اگه ادرس را ذخیره کنیم بهتر نیست؟
سلام

خیلی سوال خوبی پرسیدید. ممنونم.

به صورت کلی بنده هیچ وقت توصیه نمی کنم که یه فایل توی دیتابیس ذخیره بشه. چون خوندن بایت به بایت از دیتابیس، سرعت رو کاهش میده و منابع سیستم رو درگیر خودش میکنه. اما این مسأله باید کیس بای کیس بررسی بشه. مثلاً در پروژه ای، احتیاج هست که فایل ها در جای امنی به جز روی هارد نگه داری بشن، خب یکی از راه ها اینه که فایل ها رو به دیتابیس منتقل کنیم. در جایی فایل ها دائم درحال جابجایی هستن، لذا نمی تونیم آدرسشون رو صرفاً در دیتابیس ذخیره کنیم پس مجبوریم خود فایل ها رو در دیتابیس ذخیره کنیم.
اما تا حد امکان باید از این کار جلوگیری بشه چون سرعت نرم افزار به شکل بسیار بسیار محسوسی کاهش پیدا میکنه. لذا اگه مجبور نباشیم خود فایل رو ذخیره کنیم، بهترین کار همونطور که فرمودین، ذخیره آدرس ها هستش.
سلام
دوست گرامی کدی که شما نوشتید به درستی کار میکنه و هیچ مشکلی نداره.
ولی فقط اگر آدرس عکس در یک مسیر طولانی باشه این کد کار نمیکند، یعنی اگر جایی که عکس در آنجا قرار داد مسیر طولانی باشد این کد کار نمی کند!!!
لطفا راهنمایی کنید که باید چه کار کنم؟؟؟؟؟؟

با تشکر
(۱۵-اردیبهشت-۱۳۹۵, ۱۰:۳۹:۳۱)The.Ghost نوشته است: [ -> ]سلام
دوست گرامی کدی که شما نوشتید به درستی کار میکنه و هیچ مشکلی نداره.
ولی فقط اگر آدرس عکس در یک مسیر طولانی باشه این کد کار نمیکند، یعنی اگر جایی که عکس در آنجا قرار داد مسیر طولانی باشد این کد کار نمی کند!!!
لطفا راهنمایی کنید که باید چه کار کنم؟؟؟؟؟؟

با تشکر

ُسلام
اول عکس را به عنوان تمپ در یک مسیر ذخیره کن بعد هر بار اون مسیر را بهش بده :|