使用C# .Net访问SQL Server数据库的最佳方法

16

我是.NET的新手,听说有几种不同的查询SQL Server数据库的方法,如ADO.NET和实体框架。

有人能给我一些关于新应用程序最佳选择的建议吗?

感谢任何帮助或建议。


你有多少编程经验?以前使用过数据库吗? - Onkelborg
我有一些基本的C#知识,也了解SQL,只是以前没有在C#程序中访问过数据库。 - user483267
1
这是一个非常开放的问题。任何好的答案都取决于你想做什么,你有多少时间来完成,以及你已经熟悉/舒适的内容。 - jac
从你得到的回复中,显然对于这个问题并没有“最佳方法”。不到三分钟内,三个人给出了三种不同的答案 :) - Dismissile
5个回答

10

以下是使用EF与从数据库生成的代码示例(对于真正的应用程序,您可能希望从代码生成您的DB):

  1. 右键单击您的项目 >> 添加 >> 新项目 >> ADO.NET Entity Data Model。
  2. 为实体选择一个名称,例如MyEntities.edmx,然后单击下一步。
  3. 选择“从数据库生成”。
  4. 如果没有现成的连接,请配置“新连接”。单击下一步。
  5. 选择要包含在实体中的表,视图和SPROCs。完成。

您将看到一个名为MyEntities.edmx的文件添加到您的项目中。您可以以设计视图打开它,以查看实体和关系的图表。请注意,每个实体都应该有一个主键 - 最简单的方法是在每个表中添加一个ID自动递增字段或GUID列。现在,您可以像这样查询您的数据库:

// assuming a "Product" table, which has an entity pluralized to "Products"

MyEntities db = new MyEntities();

var cheapProducts = db.Products.Where(p => p.Price > 30); // var is IEnumerable<Product>

2
LINQ to SQL非常容易使用。您可以将数据库表拖放到设计器中,并在几分钟内编写相当简单的查询。
    NorthwindDataContext db = new NorthwindDataContext();

    var products = from p in db.Products
                   select p;

这基本上会被翻译成SELECT * FROM Products。

其他一些精选示例:

    var products = from p in db.Products
                   where p.Category.Name == "Beverages"
                   select p;

    var products = from p in db.Products
                   orderby p.Name
                   select p;

2
var products = db.Products; - SLaks
1
尝试展示LINQ语法...它与SQL有些相似。 - Dismissile
对于一个新项目的通用 ORM 解决方案,我会选择 NHibernate 而不是 Linq-to-Sql,但后者可能更容易上手。 - flatline

2

在我看来,最好的解决方案是在数据库和应用程序之间创建一个中间类(一种数据层),其中包含许多管理查询的方法。以下描述基于SQLite作为SQLServer(ADO连接器)的类比。

所提到的类可以是单例的,并且您可以在应用程序中任何地方调用它的实例 - 对于SQLite,它可能看起来像这样:

private static SQLite instance;

public static SQLite getInstance()
{
   if(instance == null)
   {
    instance = new SQLite();
    thread = Thread.CurrentThread.ManagedThreadId;
   }
   return instance;
}

您可以通过以下方式获取实例:
SQLite db = SQLite.getInstance();

这个类可以包含多个数据操作方法,例如:
public SQLiteCommand prepareQuery(string sql)
{
   cmd = new SQLiteCommand(sql, conn);
   return cmd;
}

public SQLiteDataReader executeReader()
{   
    return cmd.ExecuteReader();
}

public int executeInt()
{
   object obj = cmd.ExecuteScalar();
   return (int)obj;
}

它不仅可以管理事务和诊断方法。现在,如果您有其他数据库来源甚至是不同类型的数据库,您可以在应用程序中使用此类似的类,您可以创建下一个数据层(例如用于Oracle或MSSQL、MySQL等),每个数据层都实现了相同的接口:

IDataBase

现在,您拥有了某种外观,可以根据需要动态替换。

从此时开始,在应用程序中使用数据库集中在一个地方,对程序员来说是纯粹的乐趣 - 这是我的建议。


1
除非 OP 的目标纯粹是教育性的,否则最好使用现有的 DB 抽象而不是自己编写。 - Jimmy
在这种情况下,很难获得适用于所有订阅者的统一层。 - Przemysław Michalski

2

1
如果您选择这个选项,还可以考虑获取Fluent NHibernate。 - Andre Luus

2

Entity Framework 是最简单的,而且它是内置的。

你只需要导入你的模型,然后更新简单的类,这些类会自动映射到你的数据库。

这就像更新普通的对象一样,但在最后你需要调用SaveChanges来保存更改。


1
如果您正在开始一个将持续几年的项目,请不要使用EF。它会污染您的领域对象状态信息,迫使您使用特定的编码风格... VisualStudio工具对于EF来说是半成品。对于长期项目,我建议使用NHibernate。 - Darius Kucinskas
这是什么鬼,开箱即用的实体带有状态。但还有其他非常简单的选项。你最近有看过EF吗?让我来帮助你.. (http://channel9.msdn.com/Blogs/wriju/POCO-Template-in-ADONET-Entity-Framework) - Nix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接