我正在编写一个应用程序,它可以连接到任何SQL Server数据库,因此可以认为是独立的。换句话说,应用程序做的第一件事就是请求一个连接字符串。此应用程序将在数据库上执行查询和其他任务,因此需要SQL语句。
因此,由于我不打算为应用程序指定预定义的数据库,那么如何从我的C#应用程序执行SQL语句呢?我认为存储过程是不可能的,因为应用程序可以连接到任何数据库。
我可以很容易地在应用程序本身中对SQL语句进行硬编码,但我想知道在这种情况下,最佳实践方法是什么。是否可以将SQL语句嵌入到应用程序中,从而将业务逻辑和数据层本质上放在同一个应用程序中?我对此没有逻辑或技术上的问题,只是想知道这是否是一种有效的方法,或者它是否会被经验丰富的开发人员所反对?
我听说过Entity Framework,但老实说,我不确定它是做什么的,也不知道它是否有效。到目前为止,我的所有数据驱动应用程序都使用了存储过程,这是我第一次编写可以与运行时指定的数据库一起使用的应用程序。
谢谢!
发布于 2012-09-08 18:46:32
由于您正在构建一个查询构建器(没有双关语),因此您需要查询database catalog,这对于同一种DBMS下的所有数据库都是相同的。这将允许您获得任何给定数据库中的tables和其他对象的列表,以便将它们呈现给用户。
是使用纯ADO.NET还是ORM是一个正交问题。
发布于 2012-09-08 18:38:15
是的,将SQL查询嵌入到应用程序中是可以接受的。您可以使用资源文件,而不是在代码中对它们进行硬编码。连接字符串提供程序名称应使您能够为要连接的数据库选择正确的SQL方言。
请参阅使用类似方法的Event stores SQL persistence factory ResolveDialect方法。它也使用它来确定创建和调用存储过程所需的语法,而您的应用程序将(我假设)需要调用返回数据库元数据/结构的SQL。虽然它们调用的SQL是不同的,但这种模式应该非常适合您的应用程序,允许您支持许多不同的数据库。
根据您试图实现的目标,您可能还需要创建一个内部模型来表示数据库中的表、列等元数据。
编辑
对不起,我只是看到了关于只作为SQL服务器的评论。因此,客户端可以更多地使用SQL方言来确定SQL查询的结构(例如,对于代码完整)。
发布于 2012-09-08 18:11:27
如果您在.Net中进行开发,则应考虑使用Microsoft enterprise library
它提供了有关构建可伸缩应用程序的全面详细信息。
编辑:
您必须考虑处理不同的驱动程序,以处理不同的数据库引擎。可能不可能在所有数据库上运行相同的查询,因为它们通常遵循不同风格的sql。例如,mssql使用TSql,而as Oracle使用PL-Sql。
另一种解决方案是遵循Ansi sql标准。
https://stackoverflow.com/questions/12329793
复制相似问题