【问题标题】:How do I make a Generic Data Access Class?如何创建通用数据访问类?
【发布时间】:2010-08-05 14:28:24
【问题描述】:

ASP.net C# 3.5 框架,目前在 Visual Studio 2008 中运行。

我想要的是一个通用数据访问类。我已经看到了其中的几个,但我想要看到一个传递连接字符串和 SQL 语句的,它会返回一个对象列表,或者当只有一个项目是一个对象,或者当没有响应需要一个布尔值来让我知道时如果成功了?

如果不让我知道,我希望这是有道理的,我会解释更多。

【问题讨论】:

标签: c# asp.net


【解决方案1】:

您不必自己动手。查看 Microsoft.Data.dll。它介于低级 ADO.NET 代码(使用 SqlConnection、SqlCommand 等)和高级 ORM 框架(如 LINQ to SQL 或 nHibernate)之间:

Introduction to Microsoft.Data.dll

然后您的访问变得如此简单:

var db = Database.OpenConnectionString(connString);
for(var user in db.Query("select * from users"))
{
    var username = user.Username;
    // Do other stuff here
}

【讨论】:

  • 我喜欢 C# 的黑魔法......很想知道它在幕后是如何工作的。
  • 你必须安装 MDAC 才能让它工作吗?你必须引用什么 dll/命名空间(我现在正在测试这个)。
  • @Nix - 如果我没记错的话,Microsoft.Data.dll 是 WebMatrix 的一部分:asp.net/webmatrix
【解决方案2】:

你有没有看过LINQ-to-SQL(虽然不推荐,但将来不会引起微软太多关注),LINQ-to-Entities(这是微软在可预见的情况下在该领域投入的资源未来)、NHibernate 或任何其他 ORM(-ish) libraries for .NET?

它们中的任何一个都将具有允许您创建查询的机制(以更类型安全的方式,我可能会添加)并以对象形式返回结果(或者如果您正在处理标量结果,则从过程中获取结果) .

现在,它不允许您传递查询字符串,但如果您是动态生成的,那么通常情况下,这是一件非常糟糕的事情,因为大多数组合的动态 SQL 语句,如果不使用参数(你没有表明你是)会受到SQL injection 攻击。

当使用上述任何一个库时,您可以编写查询,参数将被解析并安全生成动态sql,不会受到SQL注入攻击。

【讨论】:

  • 那么,如果微软正在从 LINQ-to-SQL 迁移到 LINQ-to-Entities,那么从这个迁移到现在还有多久呢?我应该担心这个吗?我可能必须得到 NHibernate 并尝试一下。
  • @Nathan Stanford:我会专注于 LINQ-to-Entities 或 NHibernate。我更喜欢 LINQ-to-Entities 堆栈,因为可以更好地与其他 MS 技术(例如 RIA)集成,但 LINQ-to-SQL 将是我最后的选择。
【解决方案3】:

查看我对这个问题的回答:

Fastest method for SQL Server inserts, updates, selects

它不是一个完整的类,但它为一个很好的通用实现奠定了基础,该实现将与 linq-to-objects 一起使用。

【讨论】:

  • 这是最接近我想要的。我会试试这个,看看它是否适合我。
猜你喜欢
  • 2014-07-31
  • 1970-01-01
  • 2021-07-25
  • 2012-08-08
  • 1970-01-01
  • 2013-01-07
  • 1970-01-01
  • 2015-01-04
  • 2013-01-10
相关资源
最近更新 更多