MySQL和SQL Server用于相同的应用程序

时间:2008-11-06 15:53:20

标签: .net database enterprise-library

在没有实际编写两个DAL的情况下,有什么方法可以实现这种DB不可知论?我听说数据访问应用程序块适用于此。

8 个答案:

答案 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也会有不同之处,如下所示:

  • 参数名称语法
  • 位置参数与命名参数
  • 功能名称
  • 一些语法差异,比如如何指定只给我前N行

如果你需要涵盖所有这些东西,并且不能或不会使用ORM(虽然它们很少让你100%),那么一种方法是创建自己的类,不仅抽象出来涉及的实际类,但也做一些类型的SQL重写来处理代码差异。

我已经走了重写路径,所以如果你需要指点,请在问题的答案中添加评论,我会相应地更新答案。

答案 4 :(得分:0)

使用ERD图表工具构建纯粹的逻辑设计,然后让它为每个选项生成DDL。

您可以查看DBDesigner ...

http://www.fabforce.net/downloads.php

答案 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的人才需要这些代码。