نوشته شده توسط
csharpcollegian
سلام دوستان وقتتون به خیر
سال نو رو پیشاپیش به همه عزیزان تبریک میگم
دوستان من برای پروژه ی جدیدم تصمیم گرفتم از FileTable ها برای ذخیره ی عکس هام استفاده کنم. جستجوی زیادی توو نت کردم و با نحوه ی ایجاد و همچنین ثبت اطلاعات در FileTable ها آشنا شدم.
فقط یک سوال برام باقی مونده و اونم نحوه ارتباط میان یک FileTable و جداول بانک اطلاعاتی هستش !؟
چیزی که من فهمیدم اینه که باید عکسم رو در FileTable مربوطه ذخیره کنم و سپس از ستون stream_id در جدولی که عکس مربوط به اون هست استفاده کنم. خب پس باید در جدول مربوطه یک ستون ImageID ایجاد کنم و اون رو به عنوان کلید خارجی FileTable در نظر بگیرم و مقدار stream_id رو داخلش قرار بدم. اما خب مشکل اینجاست که توو مطالبی که من در رابطه با FileTable ها خوندم، نوشته که نباید هیچ تغییری در اونها ایجاد کرد و زمانی هم که سعی می کنم بین جدول اصلی و FileTable رابطه ایجاد کنم، SQL Server یه هشدار میده و سپس رابطه رو ایجاد می کنه !
میخواستم بدونم آیا این هشدار بعدا مساله ساز نمیشه ؟ اصلا راه اصولی استفاده از FileTable ها همینطوره ؟
ببخشید که سوالم خیلی طولانی شد
خیلی ممنونم
امکان قرار دادن رابطه روی FileTable نیست. به جای FileTable از جداول معمولی که FileStream فعال شده استفاده کنید که همون کار رو انجام میدن.
ابتدا فایل استریم رو در سطح پایگاه داده فعال کنید. (که چون FileTable ساختین الزاما فعال شده)
ابتدا دستورات زیر رو اجرا کنید که تابعی برای تشخیص نوع فایل به پایگاه داده اضافه بشه:
CREATE FUNCTION [dbo].[GetFileType](@fileName nvarchar(Max)) RETURNS nvarchar(300)
AS
BEGIN DECLARE @Index int;
SET @Index = CHARINDEX('.', REVERSE(@fileName)) - 1;
IF(@Index < 1)
RETURN N'Unknown';
RETURN RIGHT(@fileName, @Index)
END
سپس یک جدول بسازید:
CREATE TABLE [dbo].[tbl_FileStores]( [FileStoreId] [uniqueidentifier] ROWGUIDCOL NOT NULL DEFAULT (newsequentialid()),
[FileData] [varbinary](max) FILESTREAM NULL,
[FileName] [nvarchar](255) NOT NULL,
[MimeType] [nvarchar](300) NOT NULL,
[FileType] AS ([dbo].[GetFileType]([FileName])),
[FileSize] AS (datalength([FileData])),
[CreationTime] [datetime] NOT NULL DEFAULT (getdate()),
CONSTRAINT [PK_dbo.tbl_FileStores] PRIMARY KEY CLUSTERED
(
[FileStoreId] ASC
) ON [PRIMARY] FILESTREAM_ON [db_Sajaa_DataFileGroup]
) ON [PRIMARY] FILESTREAM_ON [db_Sajaa_DataFileGroup]
حالا میتونید رابطه ایجاد کنید. در واقع این جدول با جدول FileTable تفاوتی نداره و هردو از یک ساختار استفاده میکنن. منتها اینجا من ساختار دایرکتوری رو حذف کردم چون به اون نیازی نداشتم. در صورتیکه شما نیاز داشته باشی میتونی ستون مربوطه رو اضافه کنی.
فقط به جای db_Sajaa_DataFileGroup شما باید اسم FileGroup که ساختی رو قرار بدی.