简单的表述就是
你有一个存储过程,有一个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来读取第二个即可