在过去的几天中,我试图在MySQL中编写一个存储过程,并且我有一些很糟糕的方法使它变得工作。希望这里有人可以给我一些投入:)

我发布的示例是为ASP.NET成员资格提供商创建新用户的示例。我希望将电子邮件和密码发送到数据库,并获得INT返回,以验证用户发展是否已写入DB。

我使用MySQL DB 5.1(我认为)并将SQL写入Webinterface。

我得到了两个侧面问题,有人也可以解释一下:):1)我使用一个定界线,但不知道它的作用。 2)我不确定我是否必须做其他事情,然后设置自动化= 0才能使交易工作,或者我什至必须这样做。

我知道我本可以使用IF / Els语句而不是交易,但想与一个人一起来找出其工作原理。 (我希望以后使用很多)

我无法使用的代码:

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语法有错误;检查与您的MySQL Server版本相对应的手册,以获取正确的语法,以便在'int begin obles set autocommit = 0;声明return_value int; '在第4行

没有正确的解决方案

其他提示

要获得交易的支持,请确保您使用InnoDB存储引擎,而不是默认的Myisam。

至于该代码本身,我的第一个问题是,为什么要在交易中包装该查询?另外,您看到什么错误?

该定界符重新定义了您用来结束SQL语句的字符序列。整个创建过程是一个重要的声明,您需要告诉MySQL它以某物结尾(通常为';')。但是,由于您在创建过程语句的“正文”(在开始和结束之间)中有许多其他陈述,所有这些都需要结束,因此您还需要重新定义定义符,因此您不会在此处结束创建过程语句第一的 ';'。

在不重新定义定界符的情况下,MySQL会认为创建过程语句看起来像这样,然后开始新的语句:

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

    BEGIN
    SET autocommit = 0;

使用定界符;在脚本的末尾,将定界符更改为';尽管这样做是一个好习惯,但不需要。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top