【问题标题】:.NET standalone MySQL connector/wrapper [closed].NET 独立 MySQL 连接器/包装器 [关闭]
【发布时间】:2014-07-24 00:42:07
【问题描述】:

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

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

我正在寻找一个类似Yii的数据库管理,至少有:

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

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

有人有什么建议吗?

注意: Connector/Net 似乎与我要找的很接近,但我发现它在实现方面并不直接,我想在此之前得到一些建议投入大量时间。

【问题讨论】:

    标签: mysql .net crud


    【解决方案1】:

    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 连接器/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 命令)。 Entity Framework 有所作为,因为它需要提供者本身来支持它,这就是为什么你也需要MySql.Data.Entities

    只是一个快速提示。我谈到的所有内容都可以通过 nuget 获得。

    【讨论】:

    • 非常感谢您提供一些指导,而不仅仅是投反对票。我知道这看起来像是一个非常基本的问题,但作为一个没有入门的人,我发现自己很难找到这些信息(当然,这就是我决定在这里发布它的原因)。这对我来说是一堵墙,我以前不明白 => “这些框架中的大多数都不是 MySQL 特定的”。当然,现在你提到它似乎是合乎逻辑的。我还想要一个独立于 dll 的框架,这似乎并不容易找到。我将开始在 EF 和 Dapper 的方向上进行挖掘,看看哪个更适合。
    • @Tremor 我添加了一个小例子。最好的办法是开始了解 ADO.NET 的概念 - 如果您知道如何通过 ADO 读取/写入数据,则可以切换到更高的抽象级别。
    • 这非常有帮助!我一直在测试它,在你提到的所有事情中,DataTable 对象的存在让我大吃一惊……我想这是非常基本的,我觉得这个 xkcd 中的角色:xkcd.com/1053。我认为这意味着我不再需要每个表的自定义类。无论如何,我仍然需要每个表/对象的一些自定义函数,但仍然。我有点担心性能(DataTable obj 中有很多信息!),但我稍后会看到。我也更喜欢非硬编码的查询字符串,但我不确定它是否可以避免。再次:非常感谢。
    • 作为更新(以及可能看到这篇文章的其他人)this is a good video 将@SchlaWiener 提供的大部分信息联系在一起,重点介绍了对 dapper-dot-net 的非常概括的介绍。另一方面,我仍然觉得在整个过程中只使用 MySql.Data.dll 很难(我什至会说在实体框架中是不可能的,请参阅this related post)。
    • @Tremor 该链接来自 2010 年 - 我可以告诉您,可以将 mysql 与实体框架一起使用。如果您想使用一些 EF 功能,例如从数据库生成代码,您必须安装连接器(我建议使用 mysql 安装程序 dev.mysql.com/downloads/installer )无论如何这只适用于您的开发机器。 MySql.DataMySql.Data.Entities 是您在客户电脑上所需的一切。
    猜你喜欢
    • 1970-01-01
    • 2014-08-17
    • 1970-01-01
    • 2016-02-02
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    相关资源
    最近更新 更多