دسته بندی ها
14:09 1400/10/26

استفاده از DataTable برای دریافت اطلاعات از دیتابیس در سی شارپ

مشخصات سوال کننده :
کاربر : mojtabahakimian     امتیاز کاربر : 155     رتبه کاربر : 10
دسته بندی : سی شارپ Sql Server Entity Framework WPF

به این سوال امتیاز بدهید    1
تعداد بازدید این سوال : 6207
هوش مصنوعی

پاسخ هوش مصنوعی

برای دسترسی به محتوای داخل DataTable و تغییر مقادیر آن به شکل دلخواه می توانید از کد زیر استفاده کنید. در این مثال، ما فرض می کنیم که در DataTable شما ستونی به نام "CustomerID" وجود دارد و شما می خواهید نام مشتری را تغییر دهید اگر "CustomerID" برابر با 12 باشد:

foreach (DataRow row in ds.Tables[0].Rows)
{
    if (row.Field("CustomerID") == 12)
    {
        row["NAME"] = "New Name"; // نام را تغییر بدهید
    }
}

این کد، از یک حلقه foreach برای عبور از تمام سطرهای جدول استفاده می کند و در صورت برابری مقدار "CustomerID" با 12، نام مشتری را تغییر می دهد.

برای تبدیل DataTable به List، شما می توانید کلاس عمومی ایجاد کنید که شامل خواص مورد نیاز شما باشد. در اینجا نحوه تبدیل DataTable به لیست از نوع کلاس را نشان می دهیم:

public class Customer
{
    public int CustomerID { get; set; }
    public string Name { get; set; }
    public bool Activation { get; set; }
}

List customerList = ds.Tables[0].AsEnumerable().Select(row => new Customer
{
    CustomerID = row.Field("CustomerID"),
    Name = row.Field("NAME"),
    Activation = row.Field("Activation")
}).ToList();

با استفاده از این کد، شما می توانید یک لیست از نوع Customer ایجاد کنید که فقط شامل سطرهای موجود در DataTable می باشد و به مقادیر مربوطه در هرRow دسترسی دارید.

برای سوال دوم شما درباره ایجاد کلاسی انعطاف پذیر، می توانید از dynamic یا ExpandoObject استفاده کنید که اجازه می دهد خاصیت های مختلف بدون نیاز به تعریف دقیق آنها ایجاد شوند. در اینجا یک مثال ساده با استفاده از ExpandoObject است:

using System.Dynamic;

dynamic flexibleObject = new ExpandoObject();
flexibleObject.CustomerID = 12; // می توانید هر خاصیت را در اینجا اضافه کنید
flexibleObject.Name = "John Doe"; // این را هم می توانید اضافه کنید 

// دسترسی به مقادیر
Console.WriteLine(flexibleObject.CustomerID); // 12
Console.WriteLine(flexibleObject.Name); // John Doe
به این پاسخ امتیاز بدهید    0
امتیاز: - رتبه: -
پاسخ دهنده : Sowgandi 19:26 1400/10/26

سلام دوست گرامی

مشکلی که فرمودید قابل حله و نیاز نیست شما از DataTable استفاده کنید. درسته که شما در کوئری خودتون 

SELECT * FROM CUSTOMERS

 رو نوشتید ولی تا وقتی که کوئری رو واکشی نکنید هیچ باری روی سیستم و حافظه شما قرار نمیگیره. کافیه شما قبل از قرار دادن عبارت ToList ستون های مورد نیاز خودتون رو با کمک گرفتن از Linq انتخاب کنید. به مثال زیر توجه کنید.

var ResultData = (from q in dbContext.Database.SqlQuery<CUSTOMERS>(SELECT * FROM CUSTOMERS) select new {q.Name}).ToList()

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

SELECT Name FROM CUSTOMERS

در نتیجه مشکل شما حل میشه. 

ویرایش شده در یکشنبه 26 دی 1400 ساعت 19:27:14
به این پاسخ امتیاز بدهید    2
امتیاز: 876 رتبه: 3
1 نظر
mojtabahakimian : سپاس گزارم ♥ آیا میشه برای کوئری هایی که Inner Join از جداول دیگه داره هم کاری کرد ؟

امتیاز کاربر : 155   رتبه کاربر : 10   تاریخ ثبت : 09:59 1400/10/27
پاسخ دهنده : Sowgandi 18:37 1400/10/27

برای استفاده از کوئری های پیچیده و inner join از روش زیر استفاده کنید.


            string constring = dbContext.Database.Connection.ConnectionString;
            string query = @"SELECT Name FROM CUSTOMERS
                           INNER JOIN table2 ON CUSTOMERS.Name = table2.Name";

            List<CUSTOMERS> customers = new List<CUSTOMERS>();

            using (SqlConnection con = new SqlConnection(constring))
            {
                using (SqlCommand cmd = new SqlCommand(query, con))
                {
                    cmd.CommandType = CommandType.Text;
                    con.Open();
                    using (SqlDataReader sdr = cmd.ExecuteReader())
                    {
                        while (sdr.Read())
                        {
                            customers.Add(new CUSTOMERS
                            {
                                customerID = Convert.ToInt32(sdr["customerID"]),
                                Name = sdr["Name"].ToString()
                            });
                        }
                    }
                    con.Close();
                }

            }

جهت استفاده از کد فوق باید از کتابخانه ;using System.Data.SqlClien استفاده کنید. 

به این پاسخ امتیاز بدهید    2
امتیاز: 876 رتبه: 3
برای ارسال پاسخ لطفا وارد حساب کاربری خود شوید.   ورود