在没有实际编写两个DAL的情况下,有什么方法可以实现这种DB不可知论?我听说数据访问应用程序块适用于此。
答案 0 :(得分:4)
您还可以查看各种ORM库,如NHibernate。当您定位多个数据库时,最好找一个可以从配置文件或代码创建数据库的工具。这将阻止您在MySQL和MSSql中创建相同的数据库。
答案 1 :(得分:1)
一种选择是使用System.Data命名空间中的IDbConnection,IDbCommand等类进行编码,而不是使用System.Data.SqlClient中的SQL Server特定类(SqlConnection,SqlCommand)或相应的MySQL特定类进行编码。您仍然需要为您正在使用的特定数据库创建连接类的实例,但从那里您可以只使用通用接口。
http://social.msdn.microsoft.com/Forums/en-US/csharplanguage/thread/1175d7ea-f5b4-442f-9155-08bf8b2ba06c/和 http://www.15seconds.com/issue/040127.htm有一些示例代码。
答案 2 :(得分:0)
使用适用于MySQL的ADODB抽象库。本机MySQL库调用非常丑陋和原始,所以你可能想要任何更高级别的东西。
答案 3 :(得分:0)
好吧,正如其他人所指出的那样,试着将自己从实际的课程中抽象出来。这可能涉及使用接口,如AHd54指出的,或类似的东西。
这只会让你走到尽头。
您需要执行的SQL也会有不同之处,如下所示:
如果你需要涵盖所有这些东西,并且不能或不会使用ORM(虽然它们很少让你100%),那么一种方法是创建自己的类,不仅抽象出来涉及的实际类,但也做一些类型的SQL重写来处理代码差异。
我已经走了重写路径,所以如果你需要指点,请在问题的答案中添加评论,我会相应地更新答案。
答案 4 :(得分:0)
答案 5 :(得分:0)
ORM框架将帮助您实现与RDBMS无关的基础架构,但如果您正在使用UDF和存储过程,则仍需要保持单独的DAL。因此,您可能不会使用触发器,T-SQL,更新视图和CLR托管的C#代码。您只需映射实体和对象。
ADO.NET在大多数项目中都可以。如果您需要在MSSQL或MySQL之间切换,您可以像这样轻松实现与提供者无关的访问:
private static DbProviderFactory _provider = DbProviderFactories.GetFactory(WebConfigurationManager.ConnectionStrings["database"].ProviderName);
private static string _connectionString = WebConfigurationManager.ConnectionStrings["database"].ConnectionString;
public static DbParameter CreateParameter(string name, object value)
{
DbParameter parameter = _provider.CreateParameter();
parameter.ParameterName = name;
parameter.Value = value;
return parameter;
}
public static DataTable SelectAsTable(string query, DbParameter[] parameters)
{
using (DbConnection connection = _provider.CreateConnection())
{
connection.ConnectionString = _connectionString;
using (DbDataAdapter adapter = _provider.CreateDataAdapter())
{
adapter.SelectCommand = connection.CreateCommand();
adapter.SelectCommand.Parameters.AddRange(parameters);
adapter.SelectCommand.CommandText = query;
DataTable table = new DataTable();
adapter.Fill(table);
connection.Close();
return table;
}
}
}
答案 6 :(得分:0)
执行此操作的最佳方式(实际上通常是任何数据库访问层)通常是使用O / RM工具。我更喜欢ActiveRecord,它是nHibernate的包装...
以下是使用AR的一些示例源代码; code to operator object in Stacked
答案 7 :(得分:0)
.net Provider model专门用于解决此问题。通过提供一个“提供者”类来处理所有的数据库交互并从一个设计良好的基类中提取,你可以轻松地换出后端提供者(对于sql,mySql(blech),xml或其他)。 / p>
另外,根据我的经验,ORM生成的代码无法与有能力的开发人员编写的代码竞争,并且经常会产生更多的维护问题。 ORM是另一个抽象层,它为更慢,更加资源密集的代码做出贡献,只有那些不熟悉SQL的人才需要这些代码。