2009-12-16 9 views
1

Au cours des derniers jours, j'ai essayé d'écrire une procédure stockée dans MySQL et j'ai un peu de temps pour la faire fonctionner. Espérons que quelqu'un ici peut me donner une entrée :)Essayer d'apprendre MySQL et les transactions

L'exemple que je poste est pour le fournisseur d'adhésion asp.Net pour créer un nouvel utilisateur. Je m'attends à envoyer un courriel et un mot de passe à la base de données et à obtenir un retour int pour vérifier que l'utilisateur a été enregistré dans la base de données.

J'utilise une base de données MySQL DB 5.1 (je pense) et écris le SQL sur une interface web.

J'ai 2 questions latérales, quelqu'un peut-il expliquer cela aussi :): 1) J'utilise un DELIMITER, mais je ne sais pas ce qu'il fait. 2) Je ne suis pas sûr de devoir faire autre chose que de mettre autocommit = 0 pour que les transactions fonctionnent, ou même si je dois le faire.

Je sais que j'aurais pu utiliser une instruction IF/ELSE au lieu d'une transaction, mais je voudrais le faire avec un pour savoir comment cela fonctionne. (Je pense à l'utiliser beaucoup d'hôtels plus tard)

Le code que je ne peux pas travailler:

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 ; 

Edit: Le message d'erreur que je reçois est:

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 de 'INT BEGIN SET autocommit = 0; DECLARE return_value INT; 'à la ligne 4

+0

Vous pourriez vouloir écrire un titre plus significatif pour votre question. –

+0

Quelle est l'erreur? Vous n'avez jamais besoin d'envelopper une seule action dans une transaction, dans ce cas la transaction ne fait rien du tout. –

+0

Changé le titre dans un essai pour mieux décrire le problème. – Jorn

Répondre

1

Pour obtenir la prise en charge des transactions, assurez-vous que vous utilisez le moteur de stockage InnoDB plutôt que le serveur MyISAM par défaut.

En ce qui concerne ce code, ma première question serait: pourquoi encapsulez-vous cette requête unique dans une transaction? Aussi, quelles erreurs voyez-vous?

+0

Recherche InnoDB maintenant, thx. Je viens de poster l'erreur ci-dessus, aurait dû le faire dès le début, désolé – Jorn

+0

Thx pour l'info sur le moteur DB. Il semble que j'ai eu l'InnoBD par chance :) – Jorn

1

Le délimiteur redéfinit la séquence de caractères que vous utilisez pour mettre fin à une instruction sql. Toute la procédure de création est une grande déclaration et vous devez dire à MySQL où elle se termine avec quelque chose (normalement ';'). Mais puisque vous avez un tas d'autres instructions dans le "corps" (entre BEGIN et END) de l'instruction create procedure qui doivent toutes être terminées, vous devez redéfinir le délimiteur afin de ne pas terminer l'instruction create procedure au premier ';'.

Sans redéfinir le délimiteur, MySQL penserait que la create procédure ressemblait à cela et puis commencer une nouvelle déclaration:

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

    BEGIN 
    SET autocommit = 0; 

aide DELIMITER; à la fin du script, le délimiteur revient à ';' et n'est pas nécessaire bien que ce soit une bonne pratique de le faire.

Questions connexes