【问题标题】:Good approach to interface with database through gridview通过gridview与数据库交互的好方法
【发布时间】:2011-07-08 02:37:49
【问题描述】:

我正在做的是为每个表创建用于选择/插入/更新的存储过程,然后我(如果选择)用所有行填充数据表并传递给与 gridview 绑定的 objectdatasource。技术好还是坏?通过gridviews在数据库中更新/删除/插入记录有哪些好的技术(使用BO、BL、DAL)?

谢谢!

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    我做了一个数据模型层,它封装了我想暴露给主应用程序的所有数据。然后我有一个业务逻辑层,它将模型层连接到数据访问层。数据访问层是所有魔法发生的地方。在这里,我使用 System.Data、System.Data.SqlClient 或 MySQL.Data.MySQLClient(或任何你使用的——它有一个 .NET 连接器)命名空间来实际调用存储过程并将数据放入数据模型中反之亦然。

    下面是我解释过的一个例子,但我的做法有点不同。我喜欢我的数据模型来实际公开访问方法,它有助于组织数据。此外,我使用 System.Data.DataTable 将数据绑定到 gridview。它工作得非常好,甚至允许您存储主键和外键信息。它将为您管理将架构信息传递到网格视图。

    public class ImageListModel
    {
        private ImageListBLL objImageListBLL; 
    
        public ImageListModel(string connectionString, string databaseEngine, int groupID)
        {
            if(databaseEngine.ToLower() == "mysql")
                objImageListBLL = new ImageListBLL(DatabaseEngine.MySQL, connectionString);
            GroupID = groupID;
        } 
    
        public int GroupID
        {
            get;
            set;
        } 
    
        public DataTable GetImageList()
        {
            return objImageListBLL.GetImageList(GroupID);
        } 
    
        public bool InsertImage(ImageModel objImage)
        {
            objImage.GroupID = GroupID;
            return objImage.Insert();
        } 
    
        public bool DeleteImage(ImageModel objImage)
        {
            return objImage.Delete();
        } 
    
        public bool EditImage(ImageModel objImage)
        {
            return objImage.Edit();
        }
    } 
    
    public class ImageModel
    {
        private ImageBLL objImageBLL;
    
        public ImageModel(string connectionString, string databaseEngine)
        {
            if (databaseEngine.ToLower() == "mysql")
                objImageBLL = new ImageBLL(DatabaseEngine.MySQL, connectionString);
    
        } 
    
        public long ID
        {
            get;
            set;
        }
    
    
    
        public string TitleTop
        {
            get;
            set;
        } 
    
        public string TitleBottom
        {
            get;
            set;
        }
    
    
    
        public string ImageUrl
        {
            get;
            set;
        } 
    
        public string ExtraMarkup
        {
            get;
            set;
        } 
    
        public string DescriptionUrl
        {
            get;
            set;
        } 
    
        public int Order
        {
            get;
            set;
        }
    
    
        public int UserID
        {
            get;
            set;
        } 
    
        public int GroupID
        {
            get;
            set;
        } 
    
        public bool Insert()
        {
            return objImageBLL.InsertImage(this);
        } 
    
        public bool Edit()
        {
            return objImageBLL.EditImage(this);
        } 
    
        public bool Delete()
        {
            return objImageBLL.DeleteImage(this);
        } 
    
        public void ChangePosition()
        {
            objImageBLL.ChangeImagePosition(this);
        }
    }
    

    如您所见,DAL 完全隐藏。 BLL 管理调用适当的数据访问层方法。这对具有适当数据状态操作、检索和保存方法的图像的通用列表进行建模。在我看来,这就是建模的意义。

    我假设您知道如何使用 db 连接器的具体细节。如果你不知道,请告诉我,我会发布更多代码。

    我的模型工作如下:

                   DataModel -- Exposed to main application
                     |
                     |
                    \/
               Business Logic Layer
                     |
                  pass DataModel
                     |
                    \/
                Data Access Layer
    

    【讨论】:

    • 您是否需要对具有外键的对象进行继承?还是这句话没有任何意义?
    • 我通常不会让它变得那么复杂。考虑它的一种简单方法是考虑您将在网格视图中处理的对象。每个对象将有几个成员具有简单的数据类型,如 string 或 int。我将该对象的所有 id 和外键存储在类中。然后,您可以在数据模型中编写方法来根据对象的当前状态更新、插入和删除记录(我的首选方法),或者您可以将数据存储在数据模型中并将其传递给 BLL 并让它公开您的更新、插入等...您可以链接对象...
    • 一起使用老式方法,并在您的数据模型中提供参考。因此,例如,如果我有一个订单,我可能有一个客户和一个与该 orderID 关联的项目,因此订单数据模型将有一个客户和一个存储该记录数据的项目实例。我发现在一个简单的数据模型中,链接比继承更合理。
    【解决方案2】:

    这种方法是使用网格视图的基本 CRUD 功能的好方法(这可能就是您所需要的!)。您可以考虑使用 ORM(对象关系映射)工具来制作您可以玩弄的业务对象。

    【讨论】:

    • 你能给我一个不使用 ORM 的通过 BO 进行 CRUD 操作的例子吗?我的意思是代码示例。
    • 您可以build your own active record using the Enterprise Library Data Access Application Block。请记住,我们建议的任何框架、库和工具都可以帮助您更快地获得最终结果。如果需要,您始终可以从 ADO.NET 1.0 构建您自己的数据访问层。在我看来,找到完成工作的应用程序、工具、库和模式比编写自己的代码要好。因为编码难,维护代码难,测试代码难......
    【解决方案3】:

    请使用 ADO.NET 实体数据模型,非常简单!

    参考:http://msdn.microsoft.com/en-us/library/aa697427(v=vs.80).aspx

    【讨论】:

    • 要求不允许我使用 ADO.NET
    • 如果我错了,任何人都可以纠正我,但是如果您使用的是.Net,那么您必须使用ADO.NET来访问数据库,没有其他办法。但是有不同版本的 ADO.NET。 ObjectDataSource 来自 ADO.NET 2.0,Entity 框架来自 ADO.NET 3.5。
    • @Thomas 我认为你是对的。 @user194076 我相信 System.Data... 命名空间 = ADO.NET。在 C#.NET 应用程序中不使用 ADO.NET 进行实际数据访问是愚蠢的,除非有人编写了更易于使用的 Microsoft 支持的数据访问方法。如果某个经理告诉你不是这样,那就找一个新的工作地点。
    • @Thomas 总是有其他方法。我的意思是,所有连接器都是一个该死的库,通过套接字向远程 api 发送消息。无论如何,ADO.NET 总是要走的路。 OLEDB 算作 ADO.NET 吗? COM 有大量不同的数据访问方法。事实证明,ADO.NET 最适合 .NET。如果你愿意,你总是可以做一些 COM 互操作或围绕本机 api 编写包装器。为什么有人要这样做,我不知道。
    • @Jonathan Henson 或者使用 0 和 1 使自己成为可执行文件并将它们提供给 CPU。这都是关于抽象级别的。 ^_^
    猜你喜欢
    • 1970-01-01
    • 2010-09-29
    • 2017-06-17
    • 2010-10-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 1970-01-01
    相关资源
    最近更新 更多