.NET独立MySQL连接器/包装器

时间:2014-06-03 15:36:06

标签: mysql .net crud

经过大量研究后,我仍在寻找开源独立连接器/包装器 MySql.Data.dll 进行交互。

我自己制作了一个自定义的,但我对它不太满意,因为我认为它在性能和安全性方面是次优的。在重建它之前,我想确定我没有重新发明轮子。

我正在寻找 Yii-like 数据库管理,至少:

  • 自动模型类构建器。
  • 使用这些模型的基本CRUD操作(创建/读取/更新/删除)。
  • Bonus:复杂的交互(连接/多个同时创建/等)。

我很肯定我仍然需要在它的顶部构建一些自定义代码以满足我的所有要求,但它将是开始工作的坚实基础。

有人有任何建议吗?

注意: Connector/Net似乎接近我正在寻找的东西,但我没有发现它在实施方面是直截了当的,我想要一些在投入大量时间之前提出建议。

1 个答案:

答案 0 :(得分:2)

有很多不同的框架,从System.Data.Common之上的非常低级别的限制到非常重要的功能丰富的框架,如EF。

这些框架中的大多数都不是特定于MySQL的,因为ADO.NET提供了一个独立于底层数据库的良好抽象级别(除了一些SQL方言特定的细节)。

作为一个起点我会建议EF,因为它有很好的文件记录

http://entityframework.codeplex.com/

和Dapper(Stackoverflow本身在Dapper afaik上运行)

https://code.google.com/p/dapper-dot-net/

它不支持开箱即用的CRUD操作,但它上面有框架。

https://github.com/tmsmith/Dapper-Extensions

<强>更新

快速介绍ADO.NET

每个 ADO.NET驱动程序的基本概念是

  • 创建连接对象
  • 打开连接
  • 创建命令对象
  • 执行命令

这意味着每个DatabaseName ADO.NET提供商都有DatabaseNameConnectionDatabaseNameCommand(和其他一些)。

这是从mysql数据库中检索数据的一些非常基本的示例代码

    private DataTable GetUsers()
    {
        using (var conn = new MySqlConnection("Server=localhost;Database=mysql;Uid=root"))
        using (var cmd = new MySqlCommand("SELECT * FROM user", conn))
        {
            conn.Open();
            using (var reader = cmd.ExecuteReader())
            {
                var table = new DataTable();
                table.Load(reader);
                return table;
            }
        }
    }

这是完全硬连接到mysql,因为我们使用的是MySqlConnection和MySqlCommand,但这里的mysql具体是什么?只有连接字符串和原始sql查询。但是让我重写它,所以我可以使用ADO.net提供程序从每个数据库获取数据。

多一点代码,但提供商独立

    public void SomeMethod()
    {
        var helper = new DbHelper("MySql.Data.MySqlClient", "Server=localhost;Database=mysql;Uid=root");
        var users = helper.ExecuteDataTable("SELECT * FROM users");
    }

    public class DbHelper
    {
        private string providerName;
        private string connectionString;
        public DbHelper(string providerName, string connectionString)
        {
            this.providerName = providerName;
            this.connectionString = connectionString;
        }

        private IDbConnection CreateConnection()
        {
            var factory = DbProviderFactories.GetFactory(providerName);
            var conn = factory.CreateConnection();
            conn.ConnectionString = connectionString;
            conn.Open();
            return conn;
        }

        private IDbCommand CreateCommand(IDbConnection conn, string commandText)
        {
            var cmd = conn.CreateCommand();
            cmd.CommandText = commandText;
            return cmd;
        }

        private DataTable ExecuteDataTable(IDataReader reader)
        {
            var table = new DataTable();
            table.Load(reader);
            return table;
        }

        public DataTable ExecuteDataTable(string commandText)
        {
            using (var conn = CreateConnection())
            using (var cmd = CreateCommand(conn, commandText))
            {
                return ExecuteDataTable(cmd.ExecuteReader());
            }
        }

    }

如果您安装了MySQL Connector / NET,这是有效的,因为它将自己注册为DbProvider机器范围,您甚至不需要在项目中引用MySql.Data.dll。

如果您不想安装Connector / NET,则必须这样做 - 添加对MySql.Data.dll的引用 - 在app.config / web.config文件中添加一些行

    

  <remove invariant="MySql.Data.MySqlClient" />
  <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description="Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data" />

</DbProviderFactories>

现在,对DbProviderFactories.GetFactory(providerName);的调用将为您提供特定于MySql的DbProviderFactory

大多数DAL / ORM框架都使用此概念。最终他们不必首先支持MySQL(除非他们生成特定于数据库的sql命令)。实体框架有所不同,因为它要求提供商本身支持它,这也是您需要MySql.Data.Entities的原因。

快速提示。我所谈论的一切都可以通过nuget获得。