6

ファイルを循環し、.sqlその内容を実行してデータベースをセットアップする C# コードがあります。

1つの.sqlファイルは基本的に次のとおりです。

DROP PROCEDURE IF EXISTS myProc;

DELIMITER $$

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

DELIMITER ;

CALL myProc();

これを MySQL Query Browser のスクリプト ウィンドウに入力すると、完全に実行されます... 何度も何度も実行されます。

ただし、文字列を my に入れてIDbCommand実行すると...

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

...恐ろしい例外1064が発生します...

SQL 構文にエラーがあります。'DELIMITER $$ CREATE PROCEDURE myProc() BEGIN... の近くで使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。

問題は、MySQL では問題なく実行できるのに、C# から実行しようとすると失敗するのはなぜですか? そしてもちろん、2 番目の質問は、それをどのように修正するかということです。

4

3 に答える 3

2

あなたが探しているのはこれだと思います:「バグ#46429:MySql.Data.MySqlClient.MySqlScriptでDELIMITERコマンドを使用してください」

于 2009-08-24T20:59:45.760 に答える
0

スクリプト内のコマンドの一部は、SQL がサーバーに送信される前に、mysqlk クライアントの実行可能ファイルで解釈されます。

mysql コマンドを参照してください

実際には、すべての区切り記号

C# からスクリプトを解釈するには、コマンドが何であるかを認識するコードを記述する必要があります。コマンドを 1 行ずつサーバーに渡すことはできません。

たとえば、そのファイルに 3 つのコマンドがあるため、ExecuteNonQuery を 3 回だけ呼び出したいとします。

そして、paracycle のコメントから、MySqlScript クラスを使用する必要があります

于 2009-08-24T21:00:13.390 に答える