asp.net调用mysql 存储过程 带 out 返回值,返回刚插入数据库中的自增的ID,LAST_INSERT_ID() 的使用...

DELIMITER $$

USE `edt_date`$$

DROP PROCEDURE IF EXISTS `tb_ad_item_ADD`$$

CREATE   PROCEDURE `tb_ad_item_ADD`(p_Title VARCHAR(128),
p_Href VARCHAR(128),
p_Status INT,
p_HitCount INT,
p_StartTime DATETIME,
p_EndTime DATETIME,
p_IsDel BIT,
OUT p_Out_Id INT 
)
BEGIN
  -- 添加一个广告,并且返回新增加的广告的ID
   INSERT INTO `tb_ad_item` (`Title`,`Href`,`Status`,`HitCount`,`StartTime`,`EndTime`,`IsDel`)
   VALUES(p_Title,p_Href,p_Status,p_HitCount,p_StartTime,p_EndTime,p_IsDel);
   SET p_Out_Id = LAST_INSERT_ID();
END$$

DELIMITER ;
 
在asp.net里面的代码如下,在.net里面的 参数的顺序,一定要和mysql存储过程里面的顺序一模一样,不能像 mssql那样随便写。
mysql里面的参数是 ? 来表示,而mssql 是 @ 来表示,如果是有返回值,则一定是要在存储过程执行完毕之后,才能获取到值
 
/// <summary>增加一条数据,并返回刚才增加的数据的Id
        ///  
        /// </summary>
        public bool Add(EDT.Model.Item model, out int id)
        {
            int rowsAffected;
            MySqlParameter[] parameters = {
                    new MySqlParameter("?p_Title", MySqlDbType.VarChar,128),
                    new MySqlParameter("?p_Href", MySqlDbType.VarChar,128),
                    new MySqlParameter("?p_Status", MySqlDbType.Int32,11),
                    new MySqlParameter("?p_HitCount", MySqlDbType.Int32,11),
                    new MySqlParameter("?p_StartTime", MySqlDbType.Datetime),
                    new MySqlParameter("?p_EndTime", MySqlDbType.Datetime),
                    new MySqlParameter("?p_IsDel", MySqlDbType.Bit),
                    new MySqlParameter("?p_Out_Id", MySqlDbType.Int32)};

            parameters[0].Value = model.Title;
            parameters[1].Value = model.Href;
            parameters[2].Value = model.Status;
            parameters[3].Value = model.HitCount;
            parameters[4].Value = model.StartTime;
            parameters[5].Value = model.EndTime;
            parameters[6].Value = model.IsDel;
            parameters[7].Direction = ParameterDirection.Output; //表示这个参数是返回值

            rowsAffected = MySQLHelper.ExecuteNonQuery("tb_ad_item_ADD", CommandType.StoredProcedure, parameters);
            id = Convert.ToInt32(parameters[7].Value);//如果是有返回值,则一定是要在存储过程执行完毕之后,才能获取到值
            return rowsAffected > 0 ? true : false;
        }

 

上面的这种情况,是数据库只有返回值 (存储过程里面的操作是插入或者是修改,而不是查询),而没有其他的 select * 这样的语句,如果既想把 select * from 一张表的数据返回出来,又想把 out 的返回值返回出来,可以否?

暂时我测试的方法是不行,因为你如果select 返回值的话,在mysql的SQLyog里面虽然能显示是有2个查询结果,但是前台只会返回第一个结果,而返回select  * from 表的结果不返回回去。

所以我们用个变通的方法,你返回select * from 表,然后把out的返回值,作为一个列加进去

例如

SET ssql="SELECT g.*,? as nextCursor FROM tmp_table_GetTeachnew g LIMIT ?,?";
SET @query=p_Next_Cursor;
SET @fvar=limitCount;
SET @svar=pageSize;
SET @SQUERY=ssql;
PREPARE STMT FROM @SQUERY;
EXECUTE STMT USING @query,@fvar,@svar;

这里不仅仅是 limit之后 使用了2个变量,而且在 from 之前 也使用了一个变量。

 

这样我们就不用out来做返回值了,我们直接读取返回的表里面的一个字段就OK了

转载于:https://www.cnblogs.com/joeylee/archive/2013/01/24/2875050.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值