2009-08-24 16 views
6

Mam kod C#, który przechodzi przez pliki .sql i wykonuje to, co jest w środku, aby skonfigurować bazę danych.C#, MySQL, ADO.NET, ogranicznik powodujący błąd składni

Jeden .sql plik jest w zasadzie w sposób następujący:

DROP PROCEDURE IF EXISTS myProc; 

DELIMITER $$ 

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

DELIMITER ; 

CALL myProc(); 

Kiedy wejście to w oknie skryptu MySQL Query Browser jest, że działa doskonale ... w kółko, tak jak jeden chciałby go.

Jednakże, jeśli mogę umieścić napis w moim IDbCommand i wykonać ją ...

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

... mam bał wyjątku 1064 ...

masz błąd w twoja składnia SQL; sprawdzić podręcznika, który odpowiada twojej wersji serwera MySQL dla prawego składnię używaną pobliżu „DELIMITER $$ CREATE PROCEDURE moja_procedura() BEGIN ...

Więc pytanie brzmi ... dlaczego niech MySQL rób to bez żadnych problemów, ale kiedy próbuję uruchomić go z C#, to się nie powiedzie? I oczywiście drugie pytanie brzmi: jak mam to naprawić.

Odpowiedz

0

Niektóre z poleceń w skrypcie są interpretowane bt plikiem wykonywalnym klienta mysqlk przed SQL jest wysyłane do serwera.

Zobacz mysql commands

W efekcie wszystkie ograniczniki

Aby zinterpretować skrypt z C# trzeba będzie napisać kod, który wie, co komenda jest taka, że ​​nie można po prostu przejść z linii poleceń przez linię do serwera .

np. masz 3 komendy w tym pliku i tak chce zadzwonić ExecuteNonQuery tylko 3 razy

i od Coment paracycle za które trzeba użyć klasy MySqlScript

6

Dla tych, którzy szukają szybkiego fragmentu ...

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