是否有可能在C#中构建与SQL Server或MySQL无关的数据库无关代码,具体取决于连接字符串?
我想我正在寻找能够在数据库服务器上抛出SQL的东西,并返回一组非常简单的行/列。这个数据库可能是...... SQL,MySQL,Access,Filemaker等等。似乎所有数据库都有自己的驱动程序和对象库。 SqlConnection与MySqlConnection等。
我知道OBDC和OdbcConnection,它理论上可以做我想要的,但我不想一直在服务器上创建ODBC连接。
我在这里要求的太多了吗?
答案 0 :(得分:5)
看一看 NHibernate,LLBLGEN,MyGeneration,NetTiers和其他ORM。
他们可能允许你做一些你需要的抽象。有些是免费的,有些是免费的。
我个人喜欢NHibernate。
你可以使用像gleng这样的接口来做上面的事情:
public static IDbDataAdapter GetDataAdapter (Database db)
{
switch (db)
{
default:
case "MsSql":
return new SqlDataAdapter ();
case "MySql"
return new MySqlDataAdapter ();
}
}
public static IDbCommand GetCommand (Database db)
{
switch (db)
{
default:
case "MsSql":
return new SqlCommand ();
case "MySql"
return new MySqlCommand ();
}
}
答案 1 :(得分:2)
是。使用interfaces
和Dependency Injection
调用它。你可以在网上找到许多文章和教程来设置这些内容。
您的想法是根据interface
编写自己的实现。然后,您可以通过在IoC
容器中注册要使用的代码来交换这些代码,而无需更改任何代码。
答案 2 :(得分:0)
应该可以使用 System.Data.OleDb 命名空间中的类,如OleDbConnection,OleDbCommand,... 如果你只使用非常基本的sql语句,这应该有用......你也应该小心选择表定义中列的数据类型,因为每个提供者支持的类型会有所不同
答案 3 :(得分:0)
不使用ORM,答案是“不”。我的目标是将SQL作为字符串发送,并返回一个简单的行列矩阵。这显然是不可能的。
我最终编写了自己的对象,它接受了数据库类型的字符串和枚举,然后它使用switch语句来使用各种对象库进行连接。我在静态编译了库。
不是最优雅的解决方案,但它做了我想要的。