asp.net 使用mysql数据库,OUT parameter返回值为null的bug

简单的表述就是

你有一个存储过程,有一个out的返回值,并且,你还有一个select的记录集,你希望在.net里面执行ExecuteReader,然后通过Parameters[3].Value 这样来获得那个out的返回值,但是坑爹的就是显示为个null

而且明明在mysql里面用call存储过程的方式,明明就是有out的返回值,但是到了.net里面就是读不出来,坑爹啊··

 

更奇怪的是,如果你用的是 ExecuteNonQuery 这种(也就是你的存储过程,只有一个 out,没有select记录集,只是做delete或者是update),那out就又有可以读出来了···

 

很多人也碰到了类似的问题

1:http://forums.asp.net/t/1354543.aspx/1?How+to+get+OUT+parameter+from+MySQL+stored+procedure

2:http://bugs.mysql.com/bug.php?id=14836

 

那么如何解决呢?解决方法就是不要用out 了,而是直接返回两个记录集,然后分别去读取就OK了

DELIMITER $$

USE `jxtdata`$$

DROP PROCEDURE IF EXISTS `fn_j_authenticate`$$

CREATE DEFINER=`root`@`%` PROCEDURE `fn_j_authenticate`(p_Mobile VARCHAR(64),p_Password VARCHAR(64),p_UserType INT)
BEGIN
DECLARE p_Error INT DEFAULT 1; -- 默认为 有错
IF (p_UserType=1) THEN  -- 1家长,2为老师
	DROP TEMPORARY TABLE IF EXISTS tmb_authenticate;
	CREATE TEMPORARY TABLE tmb_authenticate SELECT `Fid` FROM `tb_ci_relative` WHERE `Mobile`= p_Mobile   AND `Password` = p_Password;
ELSEIF (p_UserType=2) THEN
	DROP TEMPORARY TABLE IF EXISTS tmb_authenticate;
	CREATE TEMPORARY TABLE tmb_authenticate SELECT `TId`,`SchoolId`  FROM `tb_ci_teacher` WHERE `Mobile`= p_Mobile  AND `Password` =p_Password;	
END IF;
	IF(SELECT COUNT(*)>0 FROM tmb_authenticate) THEN -- 如果这里的值为0  表示用户名和密码不匹配
		SET p_Error=0;
		SELECT p_Error;
		SELECT * FROM tmb_authenticate;
	ELSE
		SET p_Error=1;
		SELECT p_Error;
	END IF;	
    END$$

DELIMITER ;

 

上面的这个存储过程,我是绝对会返回SELECT p_Error; 但是不一定返回 SELECT * FROM tmb_authenticate;

那么我们的前台如何读取呢? 用 read 先读取第一个记录集,然后再用  nextResult来读取第二个即可

image

posted @ 2013-02-02 10:25  梨花驿路  阅读(684)  评论(0)    收藏  举报