2009-08-24 8 views
6

J'ai un code C# qui parcourt .sql fichiers et exécute ce qu'ils contiennent pour créer une base de données.C#, MySQL, ADO.NET, délimiteur provoquant une erreur de syntaxe

Un fichier .sql est essentiellement comme suit:

DROP PROCEDURE IF EXISTS myProc; 

DELIMITER $$ 

CREATE PROCEDURE myProc() 
BEGIN 
-- procedure stuff goes here 
END $$ 

DELIMITER ; 

CALL myProc(); 

Quand je entrée ceci dans la fenêtre de script de MySQL Query Browser, il fonctionne parfaitement ... encore et encore, tout comme on le souhaitez.

Cependant, si je mets la chaîne dans mon IDbCommand et l'exécuter ...

connection.Open(); // An IDbConnection 
IDbTransaction transaction = connection.BeginTransaction(); 
using (IDbCommand cmd = connection.CreateCommand()) 
{ 
    cmd.Connection = connection; 
    cmd.Transaction = transaction; 
    cmd.CommandText = line; 
    cmd.CommandType = CommandType.Text; 

    try 
    { 
     cmd.ExecuteNonQuery(); 
    } 
    catch (SqlException ex) 
    { 
     transaction.Rollback(); 
     return false; 
    } 
} 

transaction.Commit(); 
connection.Close(); 

... Je reçois l'exception redoutée 1064 ...

Vous avez une erreur votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près « DELIMITER $$ CREATE PROCEDURE myProc() BEGIN ...

Donc, la question est ... pourquoi MySQL laisse Je fais ça sans problèmes, mais quand j'essaye de l'exécuter depuis C#, ça échoue? Et bien sûr, la deuxième question est de savoir comment je suis censé le réparer.

Répondre

0

Certaines des commandes dans votre script sont interprétées bt le excutable client mysqlk avant que le SQL est envoyé au serveur.

Voir mysql commands

En effet, tous les délimiteurs

Pour interpréter le script de C# vous devez écrire du code qui sait ce que la commande est, vous ne pouvez pas simplement passer les commandes ligne par ligne au serveur .

par exemple. vous avez 3 commandes dans ce fichier et donc à appeler ExecuteNonQuery seulement 3 fois

et de la coment de paracycle vous devez utiliser la classe MySqlScript

6

Pour ceux qui recherchent un extrait rapide ...

var connectionString = @"server=ChangeMe;user=ChangeMe;pwd=ChangeMe;database=ChangeMe;"; 

var scriptText = File.ReadAllText(@"C:\script.sql"); 

using (var connection = new MySqlConnection(connectionString)) 
{ 
    var script = new MySqlScript(connection, scriptText); 
    connection.Open(); 
    script.Execute(); 
}