PDA

View Full Version : مشکل در بازیابی داده های رابطه ای از جداول.



hdv212
دوشنبه 24 اردیبهشت 1386, 21:00 عصر
سلام و خسته نباشید
من سه تا جدول t_books , t_sessions , t_titles دارم که به ترتیب دو به دو ارتباط master/details با هم دارن، زمانی که رکوردهای سه جدول رو به صورت کامل بازیابی میکنم مشکلی نیست، ولی زمانی که شرطی در query میذارم، یه پیغام خطا مبنی بر اینکه 'این constraint نمیتونه فعال بشه چون تمام داده ها مقادیر parent متناظرشون رو ندارند'

این کد منه :

SqlConnection con = new SqlConnection(Properties.Settings.Default.Database 1ConnectionString);
SqlCommand cmd = new SqlCommand();
SqlDataAdapter adapter = new SqlDataAdapter();
cmd.CommandText = "select * from t_books where bookName like '%" + searchText + "%'";
cmd.Connection = con;
adapter.SelectCommand = cmd;
DataSet ds = new DataSet();

SqlCommand cmd2 = new SqlCommand();
SqlDataAdapter adapter2 = new SqlDataAdapter();
cmd2.CommandText = "select * from t_sessions where sessionName like '%" + searchText + "%'";
cmd2.Connection = con;
adapter2.SelectCommand = cmd2;

SqlCommand cmd3 = new SqlCommand();
SqlDataAdapter adapter3 = new SqlDataAdapter();
cmd3.CommandText = "select * from t_titles where titleName like '%" + searchText + "%'";
cmd3.Connection = con;
adapter3.SelectCommand = cmd3;

adapter.Fill(ds, "t_books");
adapter2.Fill(ds, "t_sessions");
adapter3.Fill(ds, "t_titles");

DataRelation dataRelation;
DataRelation dataRelation2;

DataColumn dc1 = ds.Tables["t_books"].Columns["bookID"];
DataColumn dc2 = ds.Tables["t_sessions"].Columns["bookID"];

DataColumn dc3 = ds.Tables["t_sessions"].Columns["sessionID"];
DataColumn dc4 = ds.Tables["t_titles"].Columns["sessionID"];

dataRelation = new DataRelation("Relation1", dc1, dc2);
dataRelation2 = new DataRelation("Relation2", dc3, dc4);
ds.Relations.Add(dataRelation);
ds.Relations.Add(dataRelation2);
TreeNode book;
TreeNode session;
TreeNode title;

foreach (DataRow row in ds.Tables["t_books"].Rows)
{
book = new TreeNode(string.Format("{0}", (string)row["bookName"]));
book.Tag = row;
ds.Tables["t_sessions"].DefaultView.RowFilter = "bookID=" + row["bookID"];
for (int i = 0; i < ds.Tables["t_sessions"].DefaultView.Count; i++)
{
DataRowView sessionRow = ds.Tables["t_sessions"].DefaultView[i];
session = new TreeNode(string.Format("{0}", (string)sessionRow["sessionName"]));
session.Tag = sessionRow;

ds.Tables["t_titles"].DefaultView.RowFilter = "sessionID=" + sessionRow["sessionID"];
for (int j = 0; j < ds.Tables["t_titles"].DefaultView.Count; j++)
{
DataRowView titleRow = ds.Tables["t_titles"].DefaultView[j];
title = new TreeNode(string.Format("{0}", (string)titleRow["titleName"]));
title.Tag = titleRow;

session.Nodes.Add(title);
}

book.Nodes.Add(session);
}
this.treeView2.Nodes.Add(book);
}
error ای که میده اینه :
This constraint cannot be enabled as not all values have corresponding parent values.

error هم درقسمت اضافه کردن dataRelation دومی به دیتاست ایجاد میشه، اینجا :
ds.Relations.Add(dataRelation);
ds.Relations.Add(dataRelation2); error

میشه بگین مشکلمو چطوری حل کنم که چنین پیغامی نده ؟ مرسی

Sorenaa_s
دوشنبه 24 اردیبهشت 1386, 23:28 عصر
تو جدول Detail ها مقداری وجود داره که در جدول Master مربوطه موجود نیست

hdv212
سه شنبه 25 اردیبهشت 1386, 01:44 صبح
Sorenaa_s عزیز مرسی از لطفت، حق با شماست، اجازه بده توضیح بدم چرا این اتفاق میفته، همانطور که گفتم این سه جدول یعنی t_books , t_sessions , t_titles که با هم رابطه ی mster/details دارن در query ای که به صورت بدون شرط از سه جدول گرفته میشه مشکلی نیست چون همه ی داده ها وجود دارند و ارتباط بین جداول برقراره، ولی وقتی برای query شرط میذاریم و از سه جدول query میگیریم، ممکنه در پایینترین سطح یعنی جدول t_titles باشه ولی در سطح بالاتر که جدول t_sessions هست نباشه، بنابر این برنامه نمیتونه ارتباط بین جداول رو برقرار کنه، چون تمام داده های مورد نیاز در همه ی جداول نیست، حالا چطوری میشه این مشکل رو حل کرد ؟
یه راهش اینه که در سطوح بالا، query به صورت بدون شرط گرفته بشه و تا تمام مقادیر مورد نیاز برای ارتباط با جداول پایینتر بازیابی بشه، و شرط رو در جدول سطح پایین که همون t_titles هست بذاریم، اینطوری ارتباط برقرار میشه(تست کردم)، ولی مشکل اینجاس که در جداول سطح بالاتر تمام داده ها لود میشن و مطابق با query من نیست، کسی راه دیگه ای به نظرش نمیرسه ؟

ghafoori
سه شنبه 25 اردیبهشت 1386, 06:37 صبح
دوست عزیز دقیقا این ارتباط بین جداول را برای چه کاری لازم داری برای همین پر کردن درخت چون من هرچی در کدها دقت کردم کدی مربوط به این رابطه هایی که تعریف کردید ندیدم

houshang.karami
سه شنبه 25 اردیبهشت 1386, 08:18 صبح
من با این مشکلات زیاد برخورد کرده ام
من معمولا برای کمتر برخورد کردن به این مشکلات نکات زیر را رعایت می کنم
1- در طراحی جداول داخل بانک اطلاعاتی یک شماره ردیف منحصربفرد هم می گذارم
2- برای هر فرم یک dataset در نظر می گیرم
3- مهمتر از اینها ساختاری که برای DataTable در نظر میگرم همشه باید طبق همان ساختار پر شود اگر فیلدی مثل A یونیک باشد نباید یک query بزنیم که مثلا دوتا مقدار برای A بدست آید این مسئله زمانی اتفاق می افتد که از Group By استفاده کنیم.

hdv212
سه شنبه 25 اردیبهشت 1386, 12:29 عصر
بچه ها ممنون از جوابتون.
در جواب ghafoori عزیز باید بگم که کاربر یه کلمه ای رو جستجو میکنه و برنامه در سه جدول دنبال این کلمه میگرده و این سه جدول هم با هم ارتباط والد و فرزند دارند، حالا میخوام نتیجه ی جستجو در یک treeView به نمایش در بیاد، همانطور که گفتم در این حالت ممکنه جستجو برای پایین ترین سطح جدول یعنی t_titles یک یه چند رکورد رو برگردونه ولی برای جداول سطح بالاتر نتونه مقداری رو برگردونه، پس چون نتونسته مقداری رو برگردونه پس برنامه نمیتونه توی اون جدول دنبال کلید متناظر با جدول دیگه بگرده، لذا ارتباط dataRelation دچار error میشه. حالا من میخوام این خطا رو برطرف کنم، چطوری میتونم ؟

hdv212
سه شنبه 25 اردیبهشت 1386, 15:39 عصر
بچه ها من نتیجه ای که میخوام بگیرم اینه :
بتونم یه جستجو در سه جدول که رابطه master/details با هم دارن انجام بدم و نتیجه رو در یه treeView نشون بدم.

hdv212
سه شنبه 25 اردیبهشت 1386, 19:31 عصر
خواهشا یه کمکی به ما بکنید.