2009-08-24 20 views
6

Tengo el código C# que recorre los archivos .sql y ejecuta lo que hay dentro de ellos para configurar una base de datos.C#, MySQL, ADO.NET, delimitador que causa el error de sintaxis

Una .sql archivo es básicamente como sigue:

DROP PROCEDURE IF EXISTS myProc; 

DELIMITER $$ 

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

DELIMITER ; 

CALL myProc(); 

Cuando éste sea incorporado ventana de instrucciones de MySQL Query Browser, que se ejecuta a la perfección ... una y otra vez, al igual que uno querría que lo haga.

Sin embargo, si pongo la cadena en mi IDbCommand y ejecutarlo ...

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

... Me da la excepción temida 1064 ...

Usted tiene un error en su sintaxis SQL; consulte el manual que corresponde a su versión del servidor MySQL para el sintaxis derecho al uso cerca de 'DELIMITER $$ CREATE PROCEDURE myProc() BEGIN ...

Entonces, la pregunta es ... ¿por qué dejar que MySQL hago esto sin problemas, pero cuando intento ejecutarlo desde C#, ¿falla? Y, por supuesto, la segunda pregunta es cómo se supone que debo solucionarlo.

Respuesta

0

Algunos de los comandos en la secuencia de comandos se interpretan bt la excutable cliente mysqlk antes de que el SQL se envía al servidor.

Ver mysql commands

En efecto todos los delimitadores

Para interpretar la secuencia de comandos de C# que tendrá que escribir código que sabe cual es el comando, no se puede simplemente pasar la línea de comandos de línea al servidor .

p. Ej. usted tiene 3 comandos en ese archivo y así desea llamar ExecuteNonQuery sólo 3 veces

y de comnent de paracycle que necesita para utilizar la clase MySqlScript

6

Para aquellos que buscan un fragmento rápida ...

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(); 
} 
Cuestiones relacionadas