質問

ここ数日にわたって、私はMySQLにストアドプロシージャを書き込もうとしましたが、それを機能させるためにいくらかの真実の手順があります。ここの誰かが私にいくつかの入力を与えることができることを願っています:)

私が投稿する例は、ASP.NETメンバーシッププロバイダーが新しいユーザーを作成するためのものです。私はDBに電子メールとパスワードを送信し、INTリターンを取得して、userdeatilsがDBに書き込まれたことを確認することを期待しています。

MySQL DB 5.1(私は思う)を使用して、SQLをWebインターフェイスに書き込みます。

私は2つのサイドクエストを得ました、誰かがそれを説明することもできます:):1)私はデリミターを使用しますが、それが何をするかわかりません。 2)トランザクションを取得するためにAutoCommit = 0を設定するために他のことをしなければならないかどうか、またはそれをしなければならないかどうかはわかりません。

私はトランザクションの代わりに / elseステートメントを使用できたことを知っていますが、それがどのように機能するかを知るためにそれを行いたいと思っています。 (後でそれをたくさん使うことを期待しています)

私が働くことができないコード:

DELIMITER //

CREATE DEFINER=`websharp_dk`@`%` PROCEDURE `CreateUser`(
    IN _username VARCHAR(100),
    IN _Password VARCHAR(100))
    RETURNS INT

    BEGIN
    SET autocommit = 0;
    DECLARE return_value INT;

    BEGIN TRY
        START TRANSACTION
                INSERT INTO User 
                (Email
                ,Password
                ,Failed_Password_Count
                ,Creation_Date)
                VALUES
                (_username
                ,_Password
                ,0
                ,Datetime.Now())
            SET return_value = 1;
        COMMIT;
    END TRY

    BEGIN CATCH
        ROLLBACK
        SET return_value = 0;
    END CATCH

    BEGIN FINALLY
    RETURN return_value;
    END FINALLY 
    END//
DELIMITER ;

編集:私が取得するエラーメッセージは次のとおりです。

1064- SQL構文にエラーがあります。 'int begin set autocommit = 0; return_value intを宣言します。 '4行目

正しい解決策はありません

他のヒント

トランザクションのサポートを得るには、デフォルトのMyISAMではなくInnoDBストレージエンジンを使用していることを確認してください。

そのコード自体に関する限り、私の最初の質問は、なぜあなたはトランザクションでその単一のクエリをラップしているのですか?また、どのようなエラーが表示されますか?

Delimiterは、SQLステートメントを終了するために使用する文字のシーケンスを再定義します。作成手順全体は1つの大きなステートメントであり、mysqlに何かで終わる場所(通常は ';')に伝える必要があります。しかし、すべてが終了する必要があるという作成手順ステートメントの「ボディ」(ボディとエンドの間)に他の声明がたくさんあるので、デリミッターを再定義する必要があるので、最初 ';'。

デリミッターを再定義することなく、MySQLはCREATE PROCEDUREステートメントがこのように見えたと考え、次に新しいステートメントを開始します。

CREATE DEFINER=`websharp_dk`@`%` PROCEDURE `CreateUser`(
    IN _username VARCHAR(100),
    IN _Password VARCHAR(100))
    RETURNS INT

    BEGIN
    SET autocommit = 0;

Delimiterを使用します。スクリプトの最後に、区切り文字が ';'に戻ります。そして、そうすることは良い習慣ですが、必要ありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top