2011-12-08 8 views
5

Ho cercato di far funzionare Linq con Mysql su Ubuntu, usando la versione Mono nei repository (2.10.5) e non ricevo altro che mal di testa.Fare in modo che Linq giochi bene con Mysql e Mono, è possibile?

Prima di tutto, ho dovuto modificare il provider MySQL sqlmetal.exe.config perché era impostato su una versione obsoleta e obsoleta per impostazione predefinita, sono riuscito a farlo funzionare impostando il connettore MySQL che ho installato su questa macchina (dai repository) come provider per sqlmetal. Ho generato il DataContext con sqlmetal per il mio database di destinazione, e sembrava funzionare, ma non ne sono completamente sicuro.

Dopo aver generato il DataContext ho creato un nuovo progetto sul MonoDevelop solo per testare questo, in un primo momento ho provato ad utilizzare un semplice MysqlConenction e controllare il connettore funzionava correttamente, ho dovuto addd il gruppo connettore per il progetto, ma va bene , ha funzionato. poi ho cercato di connettersi utilizzando il DataContext utilizzando questo codice:

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); 
       } 
      } 
     } 
    } 

Questo codice fallisce. Sembra Linq è la generazione di codice SQL male per MySQL, almeno l'eccezione è gettando sembra dire che:

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 

qualcuno sa se è possibile connettersi a MySQL utilizzando Linq e Mono? C'è qualcosa che mi manca?

Grazie!

+0

Questa questione è stata già discusso qui http://stackoverflow.com/questions/42212/how-can-i-use-linq-with-a-mysql-database-on-mono – Eugene

+1

ho letto questa domanda , ma è una domanda di 3 anni e ho pensato che le cose sarebbero cambiate ... – uorbe001

risposta

5

Non so perché tutti sembrano pensare che LINQ to SQL non funzioni su Mono.
Mono si evolve regolarmente: fino ad oggi, LINQ to SQL funziona bene con Mono e MySQL (e lo utilizzo con successo con PostgreSQL).

C'è un piccolo errore nel codice: non si specifica DbLinqProvider nella stringa di connessione. Questo è necessario per produrre codice SQL mirato su MySQL.

In questo caso, il codice SQL generato è specifico per SQL Server:

"FROM [test].[Users]" 

avrebbe dovuto essere

"FROM `test`.`Users`" 

tenta di aggiungere "DbLinqProvider = MySql" nella stringa di connessione. Questo dovrebbe risolvere il tuo problema.
See: http://www.mono-project.com/Release_Notes_Mono_2.6#LINQ_to_SQL

Si deve essere consapevoli del fatto che l'attuazione Mono/DbLinq è ancora incompleto (ad esempio, le query compilate non sono supportati), ma più che sufficiente per sviluppare un'applicazione completa.

+0

L'ho provato, ma quando aggiungo DbLinqProvider = MySsql al costruttore MysqlConenction, lancia un "System.ArgumentException: Keyword not supported Nome del parametro: dblinqprovider "eccezione e se provo a creare il DataContext utilizzando questa stringa:" DbLinqProvider = MySql; Userid = root; database = test; server = localhost; password = password "getta un" System.Data.SqlClient .SqlException: il server non esiste o la connessione è stata rifiutata. " eccezione. Credo che l'ultimo sia perché sta cercando di usare SqlConnector, che non dovrebbe per quanto ne so. – uorbe001

+2

Se si utilizza DataContext, è necessario includere DbLinqConnectionType nella stringa di connessione. Personalmente, non uso mai un'istanza diretta di MySqlConnection. Invece io uso un'istanza di DataContext con una stringa di connessione completa nel costruttore in questo modo: 'var db = new System.Data.Linq.DataContext (" Server = localhost; Database = MyDB; ID utente = postgres; Password = MyPassword; DbLinqProvider = PostgreSql; DbLinqConnectionType = Npgsql.NpgsqlConnection, Npgsql, Version = 2.0.11.92, Culture = neutral, PublicKeyToken = 5d8b90d52f46fda7 ");' – CedX

+0

Grazie, funziona. Immagino che questo sia documentato da qualche parte, non so dove però: - / – uorbe001

Problemi correlati