PDA

View Full Version : حرفه ای: تبدیل خروجی یک sp در linq



masoud_583
جمعه 27 بهمن 1391, 19:52 عصر
با عرض خسته نباشید
می خواستم بپرسم چطور می توان نتیجه یک sp رو که توسط linq فراخوانی شده رو به dataset منتقل کرد؟
DataClasses1DataContext tmp = new DataClasses1DataContext();
var q = tmp.sp();
DataSet ds = new DataSet();
ds=?

دستورات داخل پروسیجر بانک
select * from tabel1

masoud_583
شنبه 28 بهمن 1391, 18:19 عصر
ای بابا جواب این سوال این قدر پیچیده است که هیچکس جواب نداده ؟

Mahmoud.Afrad
شنبه 28 بهمن 1391, 22:18 عصر
ببین دوست عزیز وقتی var q = tmp.sp(); رو اجرا کنید q شامل اشیای بازگشتی هست که میتونید به هر دیتاسورسی بایند کنید.

var q = tmp.sp();
dataGridView1.DataSource = q;

به نظرم وقتی دارید با لینک کار میکنید دیگه دور دیتاتیبل و دیتاست رو خط بکشید چون لیست ها و IEnumerable ها و ... نیازها رو برطرف میکنه.

masoud_583
یک شنبه 29 بهمن 1391, 16:28 عصر
ممنون از پاسخ تون
اما dataset یک منبع داده درون حافظه است بنظر شما رفتار IENUMerabel می تونه جاییگزین یک منبع داده بشه؟
مثلا شما اطلاعات رو درون یک شی IEnumrabel قرار بدین و پس از اصلاحات لازم رکوردها رو در جدول مربوطه بروز رسانی کنید ؟

Mahmoud.Afrad
یک شنبه 29 بهمن 1391, 22:42 عصر
مفهوم منبع داده که فقط به دیتاست ختم نمیشه. هر لیست ، آرایه ، دیتاست ، دیتاتیبل و ... که شامل داده باشه بهش منبع داده میگن.

تا زمانی که اتصال منبع داده با دیتابیس رو از بین نبرید(یعنی از متدهای tolist و toarray استفاده نکنید) هر تغییری در منبع داده رو میتونید مستقیم در دیتابیس اعمال کنید و بلافاصله نتیجه تغییرات رو در منبع داده ببینید.

مثال:
در فرم لود اطلاعات رو در گریدویو لود کنید:

Database1Entities model = new Database1Entities();
private void Form1_Load(object sender, EventArgs e)
{
dataGridView1.DataSource = from t in model.tbl
select t;
}

با کلیک روی یک سلول اطلاعات اون سطر رو در تکست باکس قرار بدید.

tbl t;
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
t = (dataGridView1.DataSource as IEnumerable<tbl>).Skip(e.RowIndex).Take(1).Single();
textBox1.Text = t.name;
}

بعد از اعمال تغییر در تکست باکس کافیه شئ مورد نظر رو اصلاح کنید و بعد مدل رو آپدیت کنید. به دلیل اینکه منبع داده متصل هست تغییرات در گرید اعمال میشه و نیاز به رفرش دیتاگرید نیست:

private void button2_Click(object sender, EventArgs e)
{
t.name = textBox1.Text;
model.SaveChanges();

textBox1.ResetText();
}





اگر هم منبع داده گریدویو متصل نباشه باید بعد از آپدیت دیتابیس ، دیتاسورس رو دوباره مقداردهی کنید(یا فرم لود رو فراخوانی کنید). در مثال زیر دیتاسورس رو با متد tolist از دیتابیس جدا میکنیم:

Database1Entities model = new Database1Entities();
private void Form1_Load(object sender, EventArgs e)
{
dataGridView1.DataSource = (from t in model.tbl
select t).ToList();

}
tbl t;
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
t = (dataGridView1.DataSource as IEnumerable<tbl>).Skip(e.RowIndex).Take(1).Single();
textBox1.Text = t.name;
}

private void button2_Click(object sender, EventArgs e)
{
t.name = textBox1.Text;
model.SaveChanges();
textBox1.ResetText();

Form1_Load(null, null);
}

masoud_583
دوشنبه 30 بهمن 1391, 12:26 عصر
ممنون از راهنمایی کاملتون