2011-12-08 6 views
5

Linq'in Ubuntu'da Mysql ile çalışmasını, depolarda Mono versiyonunu (2.10.5) kullanmayı denedim ve baş ağrısından başka bir şey elde edemiyorum.Mysql ve Mono'yla güzel oynamak için Linq'i elde etmek mümkün mü?

Her şeyden önce, varsayılan olarak eski ve kullanım dışı bir sürüme ayarlandığından, MySQL sağlayıcısı sqlmetal.exe.config dosyasını değiştirmek zorunda kaldım, bu makineye yüklediğim MySQL bağlayıcısını ayarlama işini başarmayı başardım (depolardan) sqlmetal için sağlayıcı olarak. DataContext'i hedef veritabanım için sqlmetal ile oluşturdum ve işe yaramış gibi görünüyordu, ama tamamen emin değilim.

DataContext'i oluşturduktan sonra, bunu test etmek için monodevelop üzerinde yeni bir proje oluşturdum, ilk önce basit bir MysqlConenction kullanmayı denedim ve konektörün düzgün çalıştığını kontrol ettim, konektör aksamını projeye eklemeliydim, ancak bu iyi , işe yaradı. Sonra bu kodu kullanarak DataContext'i kullanarak bağlanmaya çalıştı:

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

Bu kod başarısız olur. Bu Linq, MySQL için atıyor en azından istisna kötü bir SQL kodu oluşturmaktır görünüyor söylemek görünüyor:

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 

kimse o MySQL kullanarak Linq ve Mono bağlanmak mümkün olup olmadığını biliyor mu? Kaybettiğim bir şey mi var?

Teşekkürler!

+0

Bu soru zaten burada http://stackoverflow.com/questions/42212/how-can-i-use-linq-with-a-mysql-database-on-mono – Eugene

+1

tartışıldı Bu soruya okumak , ama bu 3 yıllık bir soru ve ben şeylerin değişmiş olacağını düşündüm ... – uorbe001

cevap

5

Neden herkesin LINQ to SQL'in Mono üzerinde çalışmadığını düşündüğünü bilmiyorum.
Mono düzenli olarak gelişiyor: bugün itibariyle LINQ to SQL, Mono ve MySQL ile gayet iyi çalışıyor (ve PostgreSQL ile başarılı bir şekilde kullanıyorum).

Kodunuzda küçük bir hata var: bağlantı dizesinde DbLinqProvider belirtmiyorsunuz. MySQL'de hedeflenen SQL kodunu üretmek için bu gereklidir. Bu durumda

, oluşturulan SQL kod SQL Server özgüdür:

"FROM [test].[Users]" 

bağlantı dizesinde "DbLinqProvider = MySQL" eklemek

"FROM `test`.`Users`" 

deneyin olmalıydı. Bu senin problemini çözmeli.
Bkz: http://www.mono-project.com/Release_Notes_Mono_2.6#LINQ_to_SQL

Mono/DbLinq uygulaması (örneğin, derlenmiş sorgular desteklenmez) hala tamamlanmamış olduğunun farkında, ama tam bir uygulama geliştirmek için fazlasıyla yeterli olmalıdır.

+0

Bunu denedim, ancak MysqlConenction yapıcısına DbLinqProvider = MySsql eklediğimde, bir "System.ArgumentException: Anahtar sözcüğü desteklenmiyor" Parametre adı: dblinqprovider "özel durum ve bu dizeyi kullanarak DataContext'i oluşturmaya çalışırsam:" DbLinqProvider = MySql; Userid = root; database = test; server = localhost; password = password "bir" System.Data.SqlClient "atar. .SqlException: Sunucu yok veya bağlantı reddedildi. " istisna. Sonuncusu olduğuna inanıyorum çünkü bildiğim kadarıyla olmaması gereken SqlConnector'ı kullanmaya çalışıyor. – uorbe001

+2

DataContext'i kullanırsanız, bağlantı dizesine DbLinqConnectionType eklemeniz gerekir. Şahsen, doğrudan MySqlConnection örneğini kullanmıyorum. Bunun yerine, yapıcıda tam bir bağlantı dizesi olan DataContext örneğini şöyle kullanır: 'var db = new System.Data.Linq.DataContext (" Sunucu = localhost; Veritabanı = MyDB; Kullanıcı Kimliği = postgres; Parola = MyPassword; DbLinqProvider) = PostgreSql; DbLinqConnectionType = Npgsql.NpgsqlConnection, Npgsql, Sürüm = 2.0.11.92, Culture = tarafsız, PublicKeyToken = 5d8b90d52f46fda7 "); – CedX

+0

Teşekkürler, bu işe yarıyor. Sanırım bu bir yerlerde belgelenmiş, nerede olduğunu bilmiyorum: - / – uorbe001