VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1077|回复: 5

SqlHelper 执行ExecuteReader 不能得到output问题

[复制链接]

1

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-3-9 22:30:01 | 显示全部楼层 |阅读模式
我程序用的数据库操作类都用的 SqlHelper

我存储过程 存入一个 output参数,用来返回查询的行数字,可是执行 ExecuteReader 后,在取值 参数为null.我把
Reader 对象关了,才能取到,服了,我关完在取还用output 做什么。请问如何 在 Reader对象没关 之前取到 output值,是个bug么还是本身不让你取。

----------------------------------存储过程如下---------------------------
----------------------------------存储过程测试过没问题-------------------

CREATE      PROCEDURE [dbo].[SelectInitCar]
@ShowType bit,                @Rowss smallint output
AS

If @ShowType =1
Begin
     select Car.CarID,Car.CarName,Car.CarSim,Car.LogTime,
            OrienSet.Stake,OrienSet.MapStake,OrienSet.LonOrOffset,OrienSet.LatOrOffset
            From Car JOIN OrienSet ON Car.CarID = OrienSet.CarID
select @Rowss = @@rowcount

End

Else
Begin
     select Car.CarID,Car.CarName,Car.CarSim,Car.LogTime,
            OrienSet.Stake,OrienSet.MapStake,OrienSet.LonOrOffset,OrienSet.LatOrOffset,
            CarGroup.GroupID,CarGroup.GroupName
            From CarGroup
        LEFT JOIN Car ON CarGroup.GroupID = Car.GroupID
            JOIN OrienSet ON Car.CarID = OrienSet.CarID
select @Rowss = @@rowcount
End
--------------------------------------------------------------------------------------------------------------------------------------------------

----------------------代码如下------------------------------------------------------------------------------------------------------------------
SqlParameter[] sps = new SqlParameter[2];
                sps[0] = new SqlParameter("@ShowType", SqlDbType.Bit);
                sps[0].Direction = ParameterDirection.Input;

                sps[1] = new SqlParameter("@Rowss", SqlDbType.SmallInt);
                sps[1].Direction = ParameterDirection.Output;

                SqlDataReader dr = (SqlDataReader)Communal.Ahelper.ExecuteReader(Communal.SqlStr,  CommandType.StoredProcedure, "SelectInitCar", sps);
               
                //dr.Close();
                    string xxxx = Convert.ToString(sps[1].Value);
-------------------------------------------------------------------------

谁对sqlhelper比较了解的,告诉我改那里也行!!请高手指教为什么dr开着的时候取值不行?怎么解决,谢谢



回复

使用道具 举报

0

主题

3

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-8-12 12:45:01 | 显示全部楼层
返回值 必须是在
dr.close()以后 才可以获取的。。。
回复

使用道具 举报

0

主题

3

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-8-12 13:00:01 | 显示全部楼层
不管你是使用sqlhelper 还是自己
直接写 操作数据库的语句

都必须是在dr关闭以后才能获取 放回值
这个是机制问题
回复

使用道具 举报

0

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-8-12 13:15:02 | 显示全部楼层
你的参数类型可能不对,这是我的例子,你试一下

/// <summary>
                /// 增加 pusifang 返回一新增的AttachID
                /// </summary>
                /// <param name="m_Attachmemt"></param>
                /// <returns></returns>

                internal  int        AttachmemtInsertPre(SMS.Attachmemt.Framework.Components.Attachmemt m_Attachmemt)       
                {
                        int result=0;

                        AttachmemtInsert(m_Attachmemt);

                        SqlParameter[] p1=
                                {
                                        Agronet.API.Framework.Data.SqlHelper.MakeParam("@AttachID",SqlDbType.Int,        4,System.Data.ParameterDirection.ReturnValue,m_Attachmemt.AttachID)
//注意类型为ReturnValue!!!!!!!!!
                                       
                                };
                       
                        result=ReturnMaxPKID("CPP_SMS_getAttachMaxID",p1);
                        if(result<=0)
                        {
                                result=0;
                        }
                       
                        return result;
                        //return DateHandleResult("SMS_AttachmemtInsert",p,false);

                }

#region  返回主键 pusifang
                internal protected static int ReturnMaxPKID(string commandText, SqlParameter[] p)
                {
                       
                        object result= Agronet.API.Framework.Data.SqlHelper.ExecuteScalar(ConnectionString,System.Data.CommandType.StoredProcedure,commandText);
                       
                        return int.Parse(result.ToString());
                        //return         Agronet.API.Framework.Data.SqlHelper.ExecuteNonQuery(ConnectionString,CommandType.StoredProcedure,commandText,p);
                       
                }

存储过程如下:

----CPP_SMS_getAttachMaxID 0
ALTER   Procedure [dbo].[CPP_SMS_getAttachMaxID]
-- (
-- --@MaxID        int output
-- ----@test int
-- )

as
--set @MaxID= IDENT_CURRENT('Attachmemt')
----exec sp_executesql
--print @MaxID

select IDENT_CURRENT('Attachmemt')
return  





GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
回复

使用道具 举报

0

主题

4

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-8-12 13:30:02 | 显示全部楼层
用ExecuteNonQuery方法呀
回复

使用道具 举报

1

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-8-12 18:00:01 | 显示全部楼层
ExecuteNonQuery???能渠道,我得读出来值啊,我不爱用dataset慢的要死.数据略多一点就不行.帮顶后还可以!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表