PDA

View Full Version : یه سئوال در مورد قرار دادن داده های یک جدول در جدول دیگر



مهدی رحیم زاده
چهارشنبه 25 بهمن 1385, 14:21 عصر
سلام
من می خوام فیلد code مربوط به جدول bojnord رو بریزم تو جدول recycle_bin. جدول bojnord فقط فیلد code رو داره و recycle_bin دو تا فیلد به اسم code,city دارم برای این کار من از این کد ها استفاده کردم :

dt2 = setdata("insert into Recycle_bin Code,City select Code from bojnord where Code=" + textBox1.Text);

private DataTable setdata(string command)
{
OleDbDataAdapter da = new OleDbDataAdapter(command, connect);
DataTable dt = new DataTable();
da.Update(dt);
return dt;
}
ولی این کد داده رو تو recycle_bin نمیریزه ....
اشکال کارم از کجاست ....
تو رو خدا زود جواب بدین که واقعا ضروریه ....

PC2st
چهارشنبه 25 بهمن 1385, 16:03 عصر
باید قبلش یک رکورد (یا همون row) توی dt اضافه کرده باشی (برای این منظور از متد Add که توی خاصیت Rows از این شئ هست، استفاده میکنیم) و بعدش دستور sql توی خاصیت InsertCommand از شئ da نوشته شده باشه. بعدش میشه از متد update استفاده کرد.

مهدی رحیم زاده
چهارشنبه 25 بهمن 1385, 21:01 عصر
ببین دوست عزیز حالا هم که از این کد استفاده می کنم اشکال میگیره :
[CODE]private DataTable setdata(string command)
{
OleDbDataAdapter da = new OleDbDataAdapter(command, connect);
DataTable dt = new DataTable();
dt.Rows.Add();
da.InsertCommand.CommandText="insert into Recycle_bin Code,City select Code from bojnord where Code=" + textBox1.Text;
da.Update(dt);
return dt;
}[\CODE]
اینم اشکال:

Object reference not set to an instance of an object.

مهدی رحیم زاده
چهارشنبه 25 بهمن 1385, 21:02 عصر
ببین دوست عزیز حالا هم که از این کد استفاده می کنم اشکال میگیره :

private DataTable setdata(string command)
{
OleDbDataAdapter da = new OleDbDataAdapter(command, connect);
DataTable dt = new DataTable();
dt.Rows.Add();
da.InsertCommand.CommandText="insert into Recycle_bin Code,City select Code from bojnord where Code=" + textBox1.Text;
da.Update(dt);
return dt;
}
اینم اشکال:

Object reference not set to an instance of an object.

PC2st
چهارشنبه 25 بهمن 1385, 23:14 عصر
در کدهای شما، با فرض اینکه شئ connect را قبلا ایجاد کرده‌اید...
خوب، اشکال کار اینجاست که شما در کد خودتون از متد Add بدون پارامتر استفاده کرده‌اید. باید به آن یک پارامتر ارسال کنید تا با توجه به آن پارامتر، یک Row یا رکورد در dt ایجاد گردد.
پارامتر ارسالی می‌تواند از نوع Object یا ... باشد، میتوانید یک آرایه‌ای از Object به طول تعداد فیلدهای جدولتون، ایجاد کنید و سپس آنرا مقدار دهی کرده و با متد Add در شئ dt قرار دهید. در ضمن، باید قبل از اینکار، تعداد فیلدهای جدول را برای شئ dt مشخص کرده باشید که مثلا جدول شما چند فیلد دارد؟ برای این منظور (برای اینکه بصورت دستی فیلدها رو اضافه نکنی و فیلدها بطور اتوماتیک ایجاد بشه) میشه از متد Fill در شئ da استفاده کرد. پس شما در کدهای خودتون در قبل از خط پنجم (خط پنجمی که در کدهای خودتان در پست قبلی نوشته اید)، باید تعداد و نوع فیلدهای جدولتون رو برای شئ dt مشخص کنید که میتونید از کد ;(da.Fill(dt استفاده کنید که به صورت اتوماتیک متناظر با فیلدهای جدول توی database، فیلدهای جدول شئ dt را ایجاد میکند. (در ارتباط با متد Fill باید بگویم که این متد برای پر کردن dt از دستور sql ائی استفاده می‌کند که در کدهای شما در رشته Command ذخیره شده است و این رشته باید مثلا دستور SELECT باشد). بعدش از دستور ;(dt.Rows.Add(obj استفاده کنید تا یک رکورد به جدولتون توی dt اضافه کنید. البته obj هنوز توسط ما تعریف نشده است و آن پارامتری است که باید به متد add بفرستیم. به این منظور یک شئ obj از کلاس Object با طولی به تعداد فیلدهای توی جدول اصلیمون، ایجاد می‌کنیم.
مثلا بصورت ;[Object[] obj = new Object[3 آنرا تعریف میکنیم و مقادیر تک تک اعضای آرایه obj را با توجه به رکوردی که میخواهیم ایجاد کنیم، مقداردهی میکنیم. (البته لازم نیست که حتما مقداردهی شود ولی بهتر است که مقداردهی شود تا با جدول اصلی مطابقت داشته باشد). پس از این مراحل، دیگر با متد update میتوان رکورد مورد نظر را به بانک اصلی اضافه کرد با این توجه که این متد از خاصیت InsertCommand استفاده میکند. در ضمن در خاصیت InsertCommand از شئ da نباید دستورات SELECT نوشته شوند (تا اونجائی که من اطلاع دارم!) و فقط باید دستور INSERT توی این خاصیت وجود داشته باشه.
در کد شما، InsertCommand به درستی مقدار دهی نشده است، و فاقد ConnectionString است. و فکر کنم دستور INSERT نیز اشتباه باشد. درکل کد شما باید چیزی شبیه به زیر باشد:



private DataTable setdata(string command)
{
OleDbDataAdapter da = new OleDbDataAdapter(command, connect);
DataTable dt = new DataTable();
object[] obj = new object[2];
obj[0] = int.Parse(textBox1.Text);
obj[1] = "bojnord";
da.Fill(dt);
dt.Rows.Add(obj);
da.InsertCommand = new OleDbCommand("insert into Recycle_bin (Code, City) VALUES(" + textBox1.Text + ", 'bojnord')", connect);
da.Update(dt);
return dt;
}


درکدهائی که بالا نوشتم، فرض براین گرفته ام که جدول شما دو تا فیلد Code و City دارد که اولی یک کد عددی است و دومی نام شهر است.

در خط سوم، با فرض اینکه پارامترهای connect و command به درستی نوشته و به متد سازنده آن، ارسال شوند، یک شئ از DataAdapter ایجاد شده است.
obj[0] برای فیلد Code و obj[1] برای فیلد City بخاطر اضافه کردن رکورد به dt مورد استفاده قرار گرفته‌اند. البته قبل از اضافه کردن رکورد به dt باید فیلدهای جدول آن مشخص شوند که ما اینکار را به عهده متد Fill گذاشته‌ایم که فیلدهای متناظر با جدول اصلی را در dt بوجود میآید و جدول موجود در dt را پر می‌کند (با توجه به اینکه برای پر کردن جدول از دستور sql ذخیره شده در متغیر command استفاده میکند). حال که تعداد و نوع فیلدهای dt بوجود آمد، می‌توان با متد Add و شئ obj یک رکورد به آن افزود.
خاصیت InsertCommand که مشخص شد، با استفاده از Update، جدول بروز رسانی میشود (به طرزی که متوجه شدید، متد Update میفهمد که ما یک رکورد به dt اضافه کرده‌ایم پس متد Update هم سعی میکند با استفاده از خاصیت InsertCommand یک رکورد به بانک اصلی اضافه نماید.)