zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    计算与软件工程 作业四
    计算与软件工程作业三
    计算机与软件工程作业二
    计算机与软件工程 作业一
    《WWXS团队》:团队项目选题报告
    计算与软件工程作业五
    计算与软件工程作业四
    计算与软件工程 作业三
    计算与软件工程 作业二
    计算与软件工程 作业一
  • 原文地址:https://www.cnblogs.com/joeylee/p/2889806.html
Copyright © 2011-2022 走看看