如果应用程序的数据层可以用于任何数据库,那么它应该如何?

时间:2012-09-08 10:05:08

标签: c# .net sql sql-server database

我正在编写一个可以连接到任何SQL Server数据库的应用程序,因此可以被视为独立的。换句话说,应用程序所做的第一件事是请求连接字符串。该应用程序将在数据库上执行查询和其他任务,因此需要SQL语句。

因此,由于我不打算使用预定义的数据库专门定义应用程序,我如何从C#应用程序执行SQL语句?我认为存储过程是不可能的,因为应用程序可以连接到任何数据库。

我可以轻松地在应用程序本身中对SQL语句进行硬编码,但我想知道在这种情况下最佳实践方法是什么。可以在应用程序中嵌入SQL语句,从而在同一个应用程序中实际拥有业务逻辑和数据层吗?我对此没有任何逻辑或技术问题,只是想知道它是否是一种有效的方法,或者它是否会被经验丰富的开发人员所厌恶?

我听说过Entity Framework,但是说实话,我不确定它是做什么的,或者它是否有效。到目前为止,我所有的数据驱动应用程序都使用了存储过程,这是我第一次编写一个可以与运行时指定的数据库一起使用的应用程序。

谢谢!

3 个答案:

答案 0 :(得分:0)

是的,可以接受将SQL查询嵌入到应用程序中。您可以使用资源文件,而不是在代码中对它们进行硬编码。连接字符串提供程序名称应该使您能够为要连接的数据库选择正确的SQL方言。

请参阅使用类似方法的Event stores SQL persistence factory ResolveDialect方法。它使用它也确定创建和调用存储过程所需的语法,而您的应用程序将(我假设)需要调用返回数据库元数据/结构的SQL。虽然他们将调用的SQL不同,但这种模式应该非常适合您的应用程序,允许您支持许多不同的数据库。

根据您尝试实现的目标,您可能还需要创建一个内部模型,该模型表示数据库中的表,列等元数据。

[编辑]

很抱歉只看到有关SQL服务器的评论。因此,客户端可以更多地使用SQL方言来确定SQL查询的结构(例如,对于代码完成)。

答案 1 :(得分:0)

由于您正在构建一个查询构建器(不需要双关语),因此您需要查询database catalog,对于同一类型的DBMS下的所有数据库, 的内容相同。这将允许您获取任何给定数据库中的tables和其他对象的列表,以便您可以将它们呈现给用户。

您是使用纯ADO.NET还是ORM是一个正交问题。

答案 2 :(得分:-2)

如果您使用.Net进行开发,则应考虑使用Microsoft enterprise library

它提供了有关构建可伸缩应用程序的全面详细信息。

编辑:

您还必须考虑处理不同的驱动程序以处理不同的数据库引擎。可能无法在所有数据库上运行相同的查询,因为它们通常遵循不同的sql风格。例如mssql使用TSql,而Oracle使用PL-Sql。

另一个解决方案是遵循Ansi sql标准。