2011-12-08 39 views
5

我一直在試圖讓Linq與Ubuntu上的Mysql一起使用,使用版本庫中的單聲道版本(2.10.5),而且我什麼也得不到,但頭痛。讓Linq和Mysql和Mono一起玩吧,有可能嗎?

首先,我不得不修改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的不良生成SQL代碼爲MySQL,至少它拋出異常似乎是在說:

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 

有誰知道是否有可能連接到MySQL使用LINQ和Mono?有什麼我失蹤?

謝謝!

+0

這個問題已經被這裏討論 http://stackoverflow.com/questions/42212/how-can-i-use-linq-with-a-mysql-database-on-mono – Eugene

+1

我讀的問題,但這是一個3歲的問題,我認爲事情會改變... – uorbe001

回答

5

我不知道爲什麼每個人似乎都認爲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

你應該知道的是,單聲道/執行的DBLinq仍是不完整的(例如,編譯查詢不支持),但足以開發一個完整的應用程序更多。

+0

我已經嘗試過,但是當我將DbLinqProvider = MySsql添加到MysqlConenction構造函數時,它會引發「System.ArgumentException:Keyword not supported參數名稱:dblinqprovider「異常,如果我嘗試使用此字符串創建DataContext:」DbLinqProvider = MySql; Userid = root; database = test; server = localhost; password = password「它會引發一個」System.Data.SqlClient .SqlException:服務器不存在或連接被拒絕。「例外。我相信最後一個是因爲它試圖使用SqlConnector,它不應該據我所知。 – uorbe001

+2

如果您使用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「);' – CedX

+0

謝謝,這是行不通的。我想這是記錄在某處,不知道在哪裏: - / – uorbe001

相關問題