2009-12-16 53 views
1

在过去的几天里,我试图在MySQL中编写一个存储过程,并且我有一些可以让它工作的方法。希望这里有人可以给我一些输入:)试图学习MySQL和交易

我发布的例子是为asp.Net会员提供商创建一个新用户。我希望发送电子邮件和密码到数据库并获得int返回值,以验证userdeatils是否已写入数据库。

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

我有2个sidequestions,有人可以解释一下:) :) 1)我使用DELIMITER,但不知道它是什么。 2)我不知道如果我必须做其他事情,然后设置autocommit = 0让事务工作,或者我甚至必须这样做。

我知道我可以使用IF/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语法;检查与你的MySQL服务器版本相对应的手册,在'INT BEGIN SET autocommit = 0; DECLARE return_value INT; '在第4行

+0

你可能想为你的问题写一个更有意义的标题。 – 2009-12-16 09:08:46

+0

什么是错误? 你永远不需要在一个事务中包装一个单独的动作,所以在这种情况下,这个事务根本就什么也不做。 – 2009-12-16 09:09:58

+0

更改标题以尝试更好地描述问题。 – Jorn 2009-12-16 09:13:36

回答

1

要获得对事务的支持,请确保您使用的是InnoDB存储引擎而不是默认的MyISAM。至于代码本身,我的第一个问题是,你为什么要在事务中包装单个查询?另外,你看到了什么错误?

+0

现在查找InnoDB,thx。我刚刚发布了上面的错误,应该从一开始就这样做,对于有关数据库引擎的信息,对不起 – Jorn 2009-12-16 09:19:26

+0

Thx。好像我通过运气得到了InnoBD :) – Jorn 2009-12-16 09:46:07

1

分隔符重新定义了用来结束sql语句的字符序列。整个创建过程是一个大的声明,你需要告诉MySQL它以什么结尾(通常是';')。但是由于在创建过程语句的“正文”(BEGIN和END之间)中还有一些其他语句都需要结束,所以您需要重新定义分隔符,以便不必在第一';'。

不需要重新定义分隔符时,MySQL会认为CREATE PROCEDURE语句看起来像这样,然后开始一个新的说法:

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

    BEGIN 
    SET autocommit = 0; 

使用DELIMITER;在脚本的末尾将分隔符更改回';'并不需要,尽管这是很好的做法。