【问题标题】:Getting Linq to play nice with Mysql and Mono, is it possible?让 Linq 与 Mysql 和 Mono 一起玩,有可能吗?
【发布时间】:2011-12-08 11:24:36
【问题描述】:

我一直在尝试让 Linq 在 Ubuntu 上与 Mysql 一起使用,使用存储库中的 Mono 版本 (2.10.5),但我只是头疼。

首先,我必须修改 MySQL 提供程序 sqlmetal.exe.config,因为默认情况下它被设置为旧的和不推荐使用的版本,我设法让它工作设置我在这台机器上安装的 MySQL 连接器(来自存储库)作为 sqlmetal 的提供者。我用 sqlmetal 为我的目标数据库生成了 DataContext,这似乎有效,但我不完全确定。

生成 DataContext 后,我​​在 monodevelop 上创建了一个新项目来测试它,起初我尝试使用简单的 MysqlConenction 并检查连接器是否正常工作,我必须将连接器程序集添加到项目中,但这很好,有效。 然后我尝试使用以下代码使用 DataContext 进行连接:

    using System;
    using System.Linq;
    using System.Data.Linq;
    using MySql.Data.MySqlClient;

    namespace test
    {
            public class test
        {
            public static void Main (String[] args)
            {           
                Test db = new Test (new MySqlConnection("Userid=root;database=test;server=localhost;password=password"));

                foreach(var tr in db.Users)
                {
                    Console.Write(tr.Username);
                }
            }
        }
    }

此代码失败。似乎 Linq 正在为 MySQL 生成错误的 SQL 代码,至少它抛出的异常似乎是这样说的:

Unhandled Exception: MySql.Data.MySqlClient.MySqlException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '[Id], [Password], [Username]
FROM [test].[Users]' at line 1
  at MySql.Data.MySqlClient.MySqlStream.ReadPacket () [0x00000] in <filename unknown>:0 
  at MySql.Data.MySqlClient.NativeDriver.GetResult (System.Int32& affectedRow, System.Int32& insertedId) [0x00000] in <filename unknown>:0 
[ERROR] FATAL UNHANDLED EXCEPTION: MySql.Data.MySqlClient.MySqlException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '[Id], [Password], [Username]
FROM [test].[Users]' at line 1
  at MySql.Data.MySqlClient.MySqlStream.ReadPacket () [0x00000] in <filename unknown>:0 
  at MySql.Data.MySqlClient.NativeDriver.GetResult (System.Int32& affectedRow, System.Int32& insertedId) [0x00000] in <filename unknown>:0 

有谁知道是否可以使用 Linq 和 Mono 连接到 MySQL?我有什么遗漏吗?

谢谢!

【问题讨论】:

标签: c# mysql linq mono


【解决方案1】:

我不知道为什么每个人似乎都认为 LINQ to SQL 不适用于 Mono。
Mono 定期发展:截至今天,LINQ to SQL 可以很好地与 Mono 和 MySQL 配合使用(我在 PostgreSQL 上也成功使用它)。

您的代码中有一个小错误:您没有在连接字符串中指定 DbLinqProvider。这是生成针对 MySQL 的 SQL 代码所必需的。

在这种情况下,生成的 SQL 代码是特定于 SQL Server 的:

"FROM [test].[Users]"

应该是

"FROM `test`.`Users`"

尝试在您的连接字符串中添加“DbLinqProvider=MySql”。这应该可以解决您的问题。
见:http://www.mono-project.com/Release_Notes_Mono_2.6#LINQ_to_SQL

您应该知道,Mono/DbLinq 实现仍然不完整(例如,不支持编译查询),但足以开发完整的应用程序。

【讨论】:

  • 我已经尝试过了,但是当我将 DbLinqProvider=MySsql 添加到 MysqlConenction 构造函数时,它会抛出“System.ArgumentException:不支持关键字。参数名称:dblinqprovider”异常,如果我尝试使用以下字符串创建 DataContext:“DbLinqProvider=MySql;Userid=root;database=test;server=localhost;password=password”它会抛出“System.Data.SqlClient.SqlException:服务器不存在或连接被拒绝”。例外。我相信最后一个是因为它正在尝试使用 SqlConnector,据我所知它不应该这样做。
  • 如果使用 DataContext,则必须在连接字符串中包含 DbLinqConnectionType。就个人而言,我从不使用 MySqlConnection 的直接实例。相反,我在构造函数中使用带有完整连接字符串的 DataContext 实例,如下所示:var db=new System.Data.Linq.DataContext("Server=localhost; Database=MyDB; User Id=postgres; Password=MyPassword; DbLinqProvider=PostgreSql; DbLinqConnectionType=Npgsql.NpgsqlConnection, Npgsql, Version=2.0.11.92, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7");
  • 谢谢,确实有效。我想这是在某处记录的,但不知道在哪里:-/
猜你喜欢
  • 2016-05-21
  • 2021-02-10
  • 2015-06-30
  • 2012-02-06
  • 2015-07-03
  • 1970-01-01
  • 2013-09-24
  • 1970-01-01
  • 2010-09-07
相关资源
最近更新 更多