在哪里放SQL逻辑

时间:2009-09-28 10:23:15

标签: c# sql-server performance

我有一个现有的SQL Server数据库,其结构我无法真正改变,但我可以根据需要添加存储过程或新表。我必须编写一个独立的程序来访问数据库,处理数据并生成一些报告。我选择了C#和Visual Studio,因为我们几乎都是MS商店。

我已经开始探索使用VS 2008来创建所述程序。我正在尝试决定在哪里放置一些SQL逻辑。我的主要目标是尽可能简化开发并快速完成。

我是否应该将SQL逻辑放入存储过程并简单地调用存储过程并让SQL Server执行繁琐的工作并将结果交给我?或者我最好在我的代码中保留SQL查询,创建相应的命令并针对SQL Server执行它?

我感觉前者可能会表现得更好,但我已经将存储过程分别管理到我的其余代码库,不是吗?

更新:有人指出,如果C#程序或存储过程中的SQL代码相同,则性能应该相同。如果是这种情况,这是最容易维护的吗?

2009-10-02:我必须真正考虑选择哪个答案。在撰写本文时,有8个答案,基本上分为5-3,赞成将SQL逻辑放在应用程序中。另一方面,有11个向上投票,分成9-2,支持将SQL逻辑放入存储过程(以及关于这种方式的几个警告)。所以我被撕裂了。最后,我要进行投票。但是,如果我遇到麻烦,我会回来改变我选择的答案:)

8 个答案:

答案 0 :(得分:8)

如果是繁重的数据操作,请将其保存在存储过程中的db上。如果查询可能会改变一些,那么更好的位置也会在db中,否则每次更改都可能需要重新部署。

答案 1 :(得分:3)

保持存储过程中的主要工作具有灵活性的优势 - 我发现修改过程比实现程序更改更容易。不幸的是,灵活性是一把双刃剑;也可以更容易做出不明智的改变。

答案 2 :(得分:2)

我建议看看LINQ to Entities,它提供围绕任何SQL语句(CRUD)的对象关系映射包装,抽象出写入数据库所需的逻辑,并允许您编写OO代码而不是使用SQLConnections和SQLCommands。

OO代码(保存方法不存在,但你得到它的要点):

// this adds a new car to the Car table in SQL, without using ANY SQL code
Car car = new Car();
Car.BrandName = "Audi";

Car.Save(); //save is called something else and is on the 
// datacontext the car is in, but for brevity sake..

SQL代码作为SqlCommand中的字符串:

// open sql connection in your app and 
// create Command that inserts car
SqlConnection conn = new SqlConnection(connstring);
SQlCommand comm = new SqlCommand("INSERT INTO CAR...");

// execute

答案 3 :(得分:2)

版本控制和维护存储过程是一场噩梦。如果您没有遇到严重的性能问题(您认为将使用存储过程解决),我认为在您的c#代码中实现逻辑会更好(linq,亚音速或类似的东西)。

答案 4 :(得分:1)

关于在.NET源代码或SQL Server存储过程中嵌入代码之间性能差异的观点,您应该看到两种方法之间没有区别!

这是因为SQL Server会生成相同的执行计划,前提是两个不同来源的数据访问T-SQL是相同的。

您可以通过运行SQL Server Profiler跟踪并比较由两个不同的T-SQL查询源生成的执行计划来查看此操作。

鉴于此问题并回到问题的主要部分,您的实施选择应该由易于开发和您未来的可扩展性要求决定。由于您似乎是唯一一个负责该项目的人,然后选择您喜欢的内容,我怀疑这是为了保持代码集中,即在视觉工作室数据访问层(DAL)内。

当您在组织/团队中拥有单独的开发功能时,存储过程可以自成一体。例如,您的团队中的数据库开发人员可以为您创建数据访问代码,并独立于应用程序执行此操作,从而使您可以使用其他代码模块。

答案 5 :(得分:1)

更新部署:如果您需要更新该过程,则可以在用户不知情的情况下更新存储过程,而无需使服务器脱机。更新C#意味着向所有用户推出新的EXE!

答案 6 :(得分:0)

看看Entity Spaces。它是一个代码生成工具 - 但它会做更多。

学习这个工具需要做很少的工作,但是一旦你开始运行,你就永远不会回头。节省工作时间。 (我不为他们工作BTW!)

答案 7 :(得分:0)

  

我应该将SQL逻辑放入存储过程

那取决于“SQL逻辑”是什么,不是吗?如果它纯粹与数据库相关,那么存储过程可能是最合适的。如果它是“业务逻辑”,决定应用程序运行方式的规则,它肯定属于您的应用程序。

  

哪个最容易维护?

我个人认为应用程序端代码更容易,因为像C#这样的现代语言比SQL更具表现力。在T-SQL中进行任何重要的处理都会变得乏味且难以阅读。