PDA

View Full Version : کار دقيق متد FILL



the Dead
یک شنبه 06 اردیبهشت 1388, 21:35 عصر
هم MSDN رو خوندم هم يه جای ديگه ولی ابهامم رفع نشد
يه جا نوشته بود که فيل به صورت اتوماتيک اتصال را ايجاد کرده اگر قبلش باز نشده باشه. و بعد از پر کردن ديتاست خودش اتصال رو ميبنده
خوب همانطور که ميبينيد ما در اينجا دو کوری از دو جدول داريم جدول اول در هنگام صدا کردن متد فيل امده ولی دومی نه
ولی در عين حال دومی خروجی رو بدون هيچ مشکلی بر ميگردونه
ابهام من قسمت قرمز رنگه. اگر ديتاست با جدول پروداکت پر نشده پس چجوری خروجی کوری که از جدول پروداکت استفاده کرده بدون هيچ مشکلی توليد ميکند




string sql1 = @"
select
*
from
customers
";
// query 2
string sql2 = @"
select
*
from
products
where
unitprice < 10
";
string sql = sql1 + sql2;



SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = new SqlCommand(sql, conn);

DataSet ds = new DataSet();
da.Fill(ds, "customers");
DataTableCollection dtc = ds.Tables;
Console.WriteLine("Results from Customers table:");
Console.WriteLine(
"CompanyName".PadRight(20) +
"ContactName".PadLeft(23) + "\n");
string fl = "country = 'Germany'";
string srt = "companyname asc";
foreach (DataRow row in dtc["customers"].Select(fl, srt))
{
Console.WriteLine(
"{0}\t{1}",
row["CompanyName"].ToString().PadRight(25),
row["ContactName"]);
}

Console.WriteLine("\n----------------------------");
Console.WriteLine("Results from Products table:");
Console.WriteLine(
"ProductName".PadRight(20) +
"UnitPrice".PadLeft(21) + "\n");
foreach (DataRow row in dtc["products"].Rows)
{
Console.WriteLine("{0}\t{1}",
row["productname"].ToString().PadRight(25),
row["unitprice"]);
}

SMRAH1
یک شنبه 06 اردیبهشت 1388, 23:55 عصر
سلام
در هنگام فراخوانی fill یکی از دو وضعیت زیر برقرار است :
1) Connection قبلا Open شده است.پس DataAdapter کاری به اون نداره و بعد از انجام عملیات هم Connection را نمی بندد.
2) COnnection باز نیست.پس DataAdapter ابتدا Connection را Open می کند و پس از انجام عملیات اون رو Close می کنه.

the Dead
دوشنبه 07 اردیبهشت 1388, 08:47 صبح
سلام
در هنگام فراخوانی fill یکی از دو وضعیت زیر برقرار است :
1) Connection قبلا Open شده است.پس DataAdapter کاری به اون نداره و بعد از انجام عملیات هم Connection را نمی بندد.
2) COnnection باز نیست.پس DataAdapter ابتدا Connection را Open می کند و پس از انجام عملیات اون رو Close می کنه.
بابا اينو که خودم گفتم مشکلم رو حل کنيد
مشکلم چيز ديگه ای بود

منظورم اينه ما اين خط رو داريم

da.Fill(ds, "customers");
ولی اين رو نداريم

da.Fill(ds, "products");
دستور فيل به غير از اون قضيه کانکشن که اول توضيح دادم کار ديگه اش دقيقاً چيه؟
چرا نام اون جدول رو گرفته

mohsen_csharp
دوشنبه 07 اردیبهشت 1388, 10:08 صبح
وقتی شما می تویسید
string sql = sql1 + sql2;
اونوقت command شما ترکیبی از select هر دو تا جدول میشه و da به طور اتوماتیک جدول products رو هم پر میکنه.
ولی بهتره که هر جدول رو با command مناسب خودش پر کنید.
وقتی شما می نویسید
da.Fill(ds, "customers"); بدانید که "customers" عمل table mapping رو برای شما انجام میده ولی دستوری که شما در command نوشته اید و در این دستور هر دو تا جدول آمده است این دستور تعیین کننده خواهد بود.