سلام
من کد زیر نوشتم
کد:
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 نوشته است: [ -> ]سلام
دوست گرامی کدی که شما نوشتید به درستی کار میکنه و هیچ مشکلی نداره.
ولی فقط اگر آدرس عکس در یک مسیر طولانی باشه این کد کار نمیکند، یعنی اگر جایی که عکس در آنجا قرار داد مسیر طولانی باشد این کد کار نمی کند!!!
لطفا راهنمایی کنید که باید چه کار کنم؟؟؟؟؟؟
با تشکر
ُسلام
اول عکس را به عنوان تمپ در یک مسیر ذخیره کن بعد هر بار اون مسیر را بهش بده :|