PDA

View Full Version : ارتباط بین دیتابیس های مختلف



hamed jalili
شنبه 27 خرداد 1391, 19:12 عصر
با سلام ،

فرضیات مساله :

1- به تعداد نا مشخص کاربر داریم و برای هر کاربر یک Playlist . Playlist هر کاربر درون یک دیتابیس جداگانه ذخیره شده است .
* دیتابیس ها Access هستند .

2- هر Playlist از دو فیلد تشکیل شده است ، فیلد 1 و فیلد 2 . فیلد 1 مشخص کننده ی لیستی است که کاربر تعریف کرده ؛ مثلا اگر Playlist مربوط به فیلم باشد ، لیست های کاربر می توانند به عنوان نمونه : تماشا کرده ام ، تماشا نکرده ام ، دانلود خواهم کردم و ... باشند
فیلد 2 ID فیلم است ( اگر Playlist مربوط به فیلم باشد )

3- یک دیتابیس داریم که تمامی فیلم ها را با جزئیات در خود جای داده است (Details Database) . این دیتابیس یک فیلد ID دارد که فیلد 2 در Playlist به آن اشاره می کند .
http://i50.tinypic.com/t65auc.jpg
سوال :

1- چه طور می تواند ConnectionString و Query ها را به صورت Dynamic تعریف کنم ؟
با توجه به اینکه تعداد کاربرها مشخص نیست ، بنابراین نمی توان به صورت Static تک تک ConnectionString ها را تعریف کرد .

2- چه طور می توانم ارتباطی بین دو فیلد در دو دیتابیس جداگانه تعریف کنم ؟
هدف : مثلا فرض کنید ، کاربر می خواهد ببیند چه فیلم های ( با جزئیات فیلم ها ) در لیست " تماشا نکرده ام " هست !
با یک جستجو در Playlist می توان ID فیلم هایی را که در لیست " تماشا نکرده ام" هستند را به دست آورد ، چه طور می توان از این ID ها استفاده کرد و از Detail Database جزئیات این فیلم ها را به دست آورد ؟


ممنون.

Mahmoud.Afrad
شنبه 27 خرداد 1391, 20:09 عصر
اگر ساختار دیتابیس ها برای همه کابران یکسان هست در نتیجه کوئری ها یکسان خواهد بود و فقط میبایست کانکشن استرینگ را تنظیم کنید.
اگر فرض کنیم برای هر کاربر یک دیتابیس به نام کاربر داشته باشیم با داشتن نام کاربر میتوان کانکشن استرینگ رو به این صورت ایجاد کرد (با فرض اینکه نام کاربر درون متغیر username باشه)
OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|datadirectory|\DB\" + username + ".accdb");
برای مورد دوم هم فکر کنم باید جداگانه به دیتابیس ها متصل بشید. از دیتابیس اول id فیلم رو انتاب میکنید و از دیتابیس دوم میایید جزئیات اون آیدی رو سلکت میکنید. (در این حالت هم باید کانکشن استرینگ تغییر کنه)

hamed jalili
شنبه 27 خرداد 1391, 20:46 عصر
راهنمایی شما برای مورد اول به دردم خورد ، خیلی ممنون .

ولی برای مورد دوم ، به نظرم روش شما برای کاری که من می خواهم انجام بدم ، بهینه نیست . به این دلیل که ، اگر فرض کنیم در لیستی که کاربر انتخاب میکنه 100 تا فیلم باشه و بخشی از جزئیات فیلم ها در یک DataGrid نمایش داده بشه ، اون موقع باید با این روش 100 بار Database رو جستجو کنم برای جزئیات تک تک فیلم ها !!!

Mahmoud.Afrad
یک شنبه 28 خرداد 1391, 14:02 عصر
نه دیگه! اگر 100 تا آیدی هم انتخاب بشه شما میایید یک دستور سلکت مینویسی و 100 تا آیدی را جستجو میکنی
select * from tbl where id=آیدی اول OR id=آیدی دوم OR .... OR id=آیدی صدمهمچین دستوری رو در یک حلقه ایجاد میکنید و بعد اجرا میکنید. وقتی نتیجه بدست اومد برحسب انتخاب کاربر باید مرتب بشه

hamed jalili
یک شنبه 28 خرداد 1391, 22:23 عصر
روش شما درست ، ولی قرار دادن 100 تا و یا حتی خیلی بیشتر (مثلا 100,000 تا ) شرط در یک دستور زیاد جالب به نظر نمیریسه .
من دنبال این هستم که آیا روشی شبیه چیزی که من در زیر نوشتم می توان تعریف کرد ؟ این دستور کمی بهینه تر به نظر میرسه ، البته چیزی که من نوشتم درست نیست و دارم دنبال این میگردم که فرمت صحیح این دستور را پیدا کنم . شما نظری در این مورد دارید ؟


command.CommandText = @"select * from T1 INNER JOIN T2 in 'H:\DB2.accdb' ON T1.ID = T2.ID where ID = 1";

hamed jalili
یک شنبه 28 خرداد 1391, 22:36 عصر
فرمت صحیح این دستور به این صورته :


command.CommandText = @"select * from T1 INNER JOIN [H:\Projects\TEST\DB2.accdb].T2 ON T1.ID = T2.ID where T1.ID = 1";