簡體   English   中英

如何從SQL數據庫填充C#中的通用對象列表

[英]How to populate a generic list of objects in C# from SQL database

我只是學習ASP.NET c#並嘗試將最佳實踐融入我的應用程序中。 我讀到的所有內容都表示基於關注點的分離將我的應用程序分層為DAL,BLL,UI等。 我沒有傳遞數據表,而是考慮使用自定義對象,這樣我就可以松散地耦合到我的數據層,並且可以利用VS中的intellisense。 我假設這些對象會被視為DTO?

首先,這些對象在我的圖層中的位置? BLL,DAL,其他?

其次,當從SQL填充時,我應該循環通過數據讀取器來填充列表還是首先填充數據表,然后循環遍歷表以填充列表? 我知道你應該盡快關閉數據庫連接,但是填充數據表然后循環遍歷列表似乎需要更多的開銷。

第三,我現在看到的一切都說使用Linq2SQL。 我打算學習Linq2SQL,但此時我正在使用沒有外鍵設置的遺留數據庫,我沒有能力修復它。 另外,在開始進入像nHibernate這樣的ORM解決方案之前,我想了解更多關於c#的知識。 同時我不想為每個查詢鍵入所有連接和SQL管道。 現在可以使用Enterprise DAAB嗎?

你在一個問題上有很多問題。

Linq2SQL只是一種ORM類型,如果你要走那條路,我會看一下實體框架(microsoft的orm)。

讓我們來談談分層應用程序,以幫助您了解如何填充對象。 您的典型數據庫應用程序由3個層組成(有些人說4個並且將數據庫本身稱為一個層,它確實無關緊要)。 你有以下幾點:

  • UI
  • BLL
  • DAL

因此,您的溝通是與BLL進行的UI會談以及BLL與DAL的對話。 DAL將一些數據返回給BLL,BLL又將其呈現給UI。 我不知道是誰告訴你數據集/表格不好...確保讀者速度更快但並不意味着使用數據表是不好的。

讓我給你舉個例子。 不要把你的DAL想象成一個簡單的類。 開始將DAL層視為不同類的整個文件夾。 其中一個類是靜態DB類。 它是靜態的,因為您正在處理一個數據庫(在大多數情況下),因此無需實例化該類。 所以它可能看起來像這樣:

public static class DB {
private static readonly string connectionString = ConfigurationManager.ConnectionStrings[connectionStringName].ConnectionString;
private static readonly DbProviderFactory factory = DbProviderFactories.GetFactory(dataProvider);

public static int Update(string sql)
        {
            using (DbConnection connection = factory.CreateConnection())
            {
                connection.ConnectionString = connectionString;

                using (DbCommand command = factory.CreateCommand())
                {
                    command.Connection = connection;
                    command.CommandText = sql;

                    connection.Open();
                    return command.ExecuteNonQuery();
                }
            }
        }

public static DataTable GetDataTable(string sql)
        {
            using (DbConnection connection = factory.CreateConnection())
            {
                connection.ConnectionString = connectionString;

                using (DbCommand command = factory.CreateCommand())
                {
                    command.Connection = connection;
                    command.CommandType = CommandType.Text;
                    command.CommandText = sql;

                    using (DbDataAdapter adapter = factory.CreateDataAdapter())
                    {
                        adapter.SelectCommand = command;

                        DataTable dt = new DataTable();
                        adapter.Fill(dt);

                        return dt;
                    }
                }
            }
}

其中一些來自dofactory網站。 學習如何使用設計模式的重要資源。 無論如何這只是一個.class文件。 現在您需要另一個說CustomerDAO(客戶數據訪問對象)。

好的,那么你如何使用你創建的數據庫類(我會使用sprocs的組合但是為了使這個簡單的帖子讓我們現在避免存儲過程)。 如果我需要獲得客戶,我可以定義:

public IList<Customer> GetCustomers()
{
    StringBuilder sql = new StringBuilder();
    sql.Append(" SELECT CustomerId, CompanyName, City, Country ");
    sql.Append("   FROM Customer ");

    DataTable dt = Db.GetDataTable(sql.ToString());

    return MakeCustomers(dt);
}

請記住,這是一個完全不同的.class文件。 那么如何讓客戶看起來:

private IList<Customer> MakeCustomers(DataTable dt)
        {
            IList<Customer> list = new List<Customer>();
            foreach (DataRow row in dt.Rows)
                list.Add(MakeCustomer(row));

            return list;
        }

所以我在這里做的是我有一個充滿客戶的數據表。 我需要循環遍歷數據表的每一行並使客戶:

private Customer MakeCustomer(DataRow row)
        {
            int customerId = int.Parse(row["CustomerId"].ToString());
            string company = row["CompanyName"].ToString();
            string city = row["City"].ToString();
            string country = row["Country"].ToString();

            return new Customer(customerId, company, city, country);
        }

因此,該客戶是新的並存儲在客戶列表中。

這只是您的數據訪問層所做的一個小例子。 數據庫類只存儲連接字符串和函數以獲取數據集或獲取數據表,甚至在您的情況下獲取數據讀取器(您也可以這樣做)。 CustomerDAO類只是一個處理客戶對象的類,可以實現一個ICustomer接口。

那么Customer類本身在哪里? 它可以在另一個文件夾中作為業務層,因為它只是一個業務對象。 您可以在此處設置客戶類內的驗證和必填字段。

您的UI根本沒有與數據引用器,數據集或SQL相關的任何內容。 您的業​​務層也與它無關(它定義了業務對象背后的一些規則)。 您的dal可以非常靈活(可以使用SQL,Oracle等),或者可以限制為說SQL Server,如果這是您計划執行的操作。 不要過度使用你的應用程序。 如果您是MS人並且肯定只使用SQL Server,那么嘗試推出適用於任何供應商的最終DAL,不會讓您的工作變得困難。 可以使用SQLCommand,SQLConnection等。

去看看Telerik的OpenAccess ORM。 您不必將其用作“ORM”,但它可以讓您快速為表生成類,而無需全部輸入。 然后,您可以在DAL中使用這些強類型類,無論它是自定義編寫還是基於ORM的其他內容。 在這種情況下,您只是將它用於代碼生成,以便快速入門(而且這些對象非常簡單 - 也就是說,如果您要手寫它們,那么確切地說就是從哪里開始)。

至於從其他對象中抽象DAL對象,請查看WCF。 您可以將它放在每個圖層(UI / Biz / DAL)之間,它將生成代理對象,以處理您關注的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM