ورود

View Full Version : ذخیره و بازیابی فایل ها با FileTable‌ در Sql Server



hadisalahi2
چهارشنبه 21 مهر 1395, 19:47 عصر
درود بر همه دوستان عزیزم

بچه ها در حال نوشتن یک برنامه اتوماسیون هستم که می بایست فایلهای زیادی رو در سمت سرور ذخیره کنه و در صورت لزوم فراخوانی بشن

کلی دنبال گشتم و راه کار مناسب رو دوستان استفاده از File Table‌ معرفی کردند
با تحقیقی که کردم ، بانک اطلاعاتی و جدوال خودم رو به صورت File Table ساختم و همچنین فهمیدم که اطلاعات در یک پوشه اشتراکی در سمت سرور ذخیره میشن

حالا دنبال یک کد هستم که بتونم فایل رو از طریق دلفی بفرستم به جدول و هنگامی هم که خواستم اون رو Select کنم

خیلی گشتم اما چیز به درد بخوری پیدا نکردم
کد زیر رو پیدا کردم که در حالت ثابت (یعنی نام فایل رو بهش بدی در پروسیجر) کار میکنه
اما من میخوام این رو به صورت Store Proc بنویسم و از طریق دلفی اون ر فراخوانی کنم


INSERT INTO [dbo].[FileTableTb] ([name],[file_stream])
SELECT
'NewFile.txt', * FROM OPENROWSET(BULK N'd:\NewFile.txt', SINGLE_BLOB) AS FileData
GO


اینجا به جای مقادیر ثابت میخوام مقادیر پارامتر هایی که میفرستم به سمت پروسیجر ذخیره بشن .
در ضمن برای دسترسی به کد یونیک اون فایل لازمه تا اون کد رو به برنامه برگردونم

البته حدس میزنم که باید این کار رو انجام بدم
شاید دسترسی به فایلهای داخل جدول راه ساده تری داشته باشه

حالا از دوستان میخوام اگه کار کردند یک نمونه کد یا یک نمونه برنامه برای بنده قرار بدن تا بتونم از اون استفاده کنم.

دوستان خواهش میکنم موضو رو کلی گویی نکنید چون من تحقیق زیاد کردم و تقریبا با مباحث تئوریک آشنایی دارم
فقط دنبال یک نمونه کد به در بخور هستم

ممنون از همگی

khorsandreza
پنج شنبه 22 مهر 1395, 14:11 عصر
سلام هادی جان خوبی ؟
این دستور در سمت سرور اتفاق می افته شما نمی توانید فایل را توسط کاربر به سمت سرور بفرسیتید بصورت لوکال دست کار می کنه ولی بصور شبکه ایراد دارد شما ایتدا بر روی File Tableکلیک کنید
Expoler File Table Dirctory انتخابکنید با یک برنامه ساده فایل در این مسیر کپی کنید بقیه کارها را خود اسکیوال برایت انجام خواهد داد.

hadisalahi2
پنج شنبه 22 مهر 1395, 17:17 عصر
سلام جناب مهندس ولی زاده
خیلی مخلصیم
خوب من چطوری کد یونیک رو بدست بیارم که بدونم هر فایلم با چه کدی در جدول ذخیره شده که بعدا بتونم بهش با همون کد دسترسی پیدا کنم؟

اگه نمونه کد داری که ممنونت میشم برام بفرستی
:قلب::قلب::قلب:

hadisalahi2
پنج شنبه 22 مهر 1395, 18:48 عصر
با کمک دوستان یک تیکه کد پیدا کردم که جواب میده حالا از دوستان میخوام سمت سرور رو هم تست بزنن (البته جناب ولی زاده عزیز :لبخند:)



USE [SNMS_FileDataBase]
GO
/****** Object: StoredProcedure [dbo].[pics] Script Date: 22/07/1395 05:55:38 ب.ظ ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[pics]
-- Add the parameters for the stored procedure here
@aa0 VARBINARY(MAX) ,
@aa1 NVARCHAR(50),
@id NVARCHAR(50) OUTPUT
AS
BEGIN
DECLARE @bb TABLE (ID NVARCHAR(50))
BEGIN TRANSACTION [Tran1]
BEGIN TRY

INSERT INTO dbo.PhotoTable
(
[file_stream],
[name]
)OUTPUT INSERTED.stream_id INTO @bb
VALUES
(
@aa0,--پارامترهاي ورودي برنامه
@aa1
)

COMMIT TRANSACTION [Tran1]
SELECT @id= ID FROM @bb
SELECT ID FROM @bb
END TRY
BEGIN CATCH--درصورت عدم موفقيت
ROLLBACK TRANSACTION [Tran1]
SELECT @id= ERROR_NUMBER()
SELECT ERROR_NUMBER()
END CATCH

END




این هم کد سمت دلفی که Sp رو فراخوانی میکنم:



if dlgOpen1.Execute then
begin
UniStoredProc1.StoredProcName := 'pics';
UniStoredProc1.PrepareSQL(False);
UniStoredProc1.Params.ParamByName('@aa0')
.LoadFromFile(dlgOpen1.FileName, ftBlob);
UniStoredProc1.Params.ParamByName('@aa1').AsString :=
ExtractFileName(dlgOpen1.FileName);;
UniStoredProc1.ExecProc;
ShowMessage(UniStoredProc1.Params.ParamByName('@id ').AsString);
end;

khorsandreza
پنج شنبه 22 مهر 1395, 22:53 عصر
سلام اقای هادی من شکل دستورات را مطالعه کردم (هنوز تست نکردم) ولی احتمال خیلی بیشتری می دم بین کلاینت و سرور کار نکند چون امنیت اس کیو سرور به شما این اجازه را نمیدهد که از سمت کلاین فایلی را با دستورات T_Sql به سمت سرور بفرستید من نوع دیگر این روش را انجام دادم نشد بهترین روش (البته از نظر بنده) همان است که شما یک برنامه ساده بنویسید فایل را کاربر به سرور مسیر که FileTable تعیین کرده آپلود کنید و با استفاده از تریگر مقدار بازگشتی را مدیریت کنید
اگر این پست را ببنید (http://barnamenevis.org/showthread.php?420434-%D8%B1%D9%88%D8%B4-%DA%A9%D9%BE%DB%8C-%DA%A9%D8%B1%D8%AF%D9%86-%D9%81%D8%A7%DB%8C%D9%84-%D8%A8%D8%B1-%D8%B1%D9%88%DB%8C-%D8%B3%D8%B1%D9%88%D8%B1-%D8%A8%D8%AF%D9%88%D9%86-%D8%A7%D8%B4%D8%AA%D8%B1%D8%A7%DA%A9-%DA%AF%D8%B0%D8%A7%D8%B4%D8%AA%D9%86-%D9%BE%D9%88%D8%B4%D9%87)
واین پست را هم ببنید (http://barnamenevis.org/showthread.php?417859-%DA%A9%D9%BE%DB%8C-%DB%8C%DA%A9-%D9%81%D8%A7%DB%8C%D9%84-%D8%AF%D8%B1-%D8%B3%D8%B1%D9%88%D8%B1-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-IP-%D8%A8%D8%A7-%D8%A7%D8%B3%DA%A9%DB%8C%D9%88%D8%A7%D9%84-%D8%B3%D8%B1%D9%88%D8%B1)