当前位置:编程学习 > C#/ASP.NET >>

执行存储过程时 cmd.ExecuteNonQuery() 返回 -1

   如题
     如何解决 --------------------编程问答--------------------   我向数据库插入数据成功。但是返回值为-1 --------------------编程问答-------------------- 没有修改成功。。。。。 --------------------编程问答--------------------
引用 1 楼 capay 的回复:
我向数据库插入数据成功。但是返回值为-1


成功了??????


--------------------编程问答-------------------- 这个是正常的,如果你要得到返回受影响行数的就不能用这方法
cmd.ExecuteScalre()   方法名不晓得写错没有。 --------------------编程问答--------------------
引用 1 楼 capay 的回复:
我向数据库插入数据成功。但是返回值为-1

既然插入成功,那就是你代码写的有问题。把代码贴上来看看就清楚了 --------------------编程问答--------------------  成功了啊   但是返回值为-1 --------------------编程问答--------------------

string[,] param ={
                              {"@cardid",cardid},  {"@remit_money",amount.ToString()}, 
                              {"@bill_no",orderid},    
                              {"@sms_count",num}, {"@create_ip",Page.Request.UserHostAddress}, 
                              {"@remit_memo",memo}, {"@create_pserson",user_name}
                             };
                    int ieffect = DbFactory.ExecuteNonQuery("xps_card_pay", param, true);

--------------------编程问答--------------------
引用 7 楼 capay 的回复:
C# code

string[,] param ={
                              {"@cardid",cardid},  {"@remit_money",amount.ToString()}, 
                              {"@bill_no",orderid},    
                          ……


  成功了 ieffect也是等于-1 --------------------编程问答-------------------- 首先看你的存储过程是否是写错 一般像这种情况都数是存储过程写过造成的 --------------------编程问答--------------------

ALTER PROCEDURE [dbo].[xps_card_pay]
@cardid VARCHAR(50),
@remit_money DECIMAL(6,2),
@bill_no VARCHAR(50),
@sms_count int,
@create_ip VARCHAR(50),
@remit_memo VARCHAR(500),
@create_pserson VARCHAR(50)
AS
BEGIN

DECLARE @count int
select @count=count(id) from u_sms_card_record where bill_no=@bill_no

if @count=0
begin
INSERT INTO u_sms_card_record
(
cardid,
remit_type,
remit_money,
bill_no,
sms_count,
create_ip,
remit_memo,
create_pserson,
create_time
)
VALUES
(
@cardid,
2,
@remit_money,
@bill_no,
@sms_count,
@create_ip,
@remit_memo,
@create_pserson,
GETDATE()
)

update u_sms_card set leavings_count=
((select leavings_count from u_sms_card where cardid=@cardid)+@sms_count),update_time=getdate()
 where cardid=@cardid
 
end
END


--------------------编程问答-------------------- 在进行增删改时,数据库能为我们统计受影响行数的前提条件是,关闭NOCOUNT,即 Set nocount off。默认情况下,它是关闭的,即我们是可以得到受影响的行数的。我们在Visual Studio中写了一个存储过程时,它会被默认加上set nocount on。这样就导致了调用存储过程时始终得不到影响的行数,而返回-1。
  对于update,insert,delete而言ExecuteNonQuery是不存在问题的,这里的问题仅仅是对select而言的 --------------------编程问答-------------------- 在进行增删改时,数据库能为我们统计受影响行数的前提条件是,关闭NOCOUNT,即 Set nocount off。默认情况下,它是关闭的,即我们是可以得到受影响的行数的。你可以测试如下(加与不加set nocount on是有区别的):

SqlCommand cmd = new SqlCommand("set nocount on; insert into test values ('test')", con);
int rows = cmd.ExecuteNonQuery();
有的人就说了,我仅仅是调用一个简单的存储过程,怎么还是返回-1呢?这个是由于Visual Studio引起的。

我们在Visual Studio中写了一个存储过程时,它会被默认加上set nocount on。这样就导致了调用存储过程时始终得不到影响的行数,而返回-1。不过我在Visual Studio 2008 Team Suit中测试了下,这个问题不存在了。可能以前的版本有这样的问题吧(未测试),碰到这种情况就多留意些
--------------------编程问答--------------------  ??? 怎么没人了?  都贴出来了 --------------------编程问答-------------------- cmd.ExecuteScalar()方法 --------------------编程问答-------------------- SET NOCOUNT OFF --------------------编程问答-------------------- 你想要的是插入还是更新呢? --------------------编程问答--------------------  等待高手!!!! --------------------编程问答-------------------- 那你模仿这些参数 去查询分析器里执行下这个存储过程 看执行结果。 --------------------编程问答-------------------- 建议还是将插入和更新还是分开写吧,,,


ExecuteNonQuery()对select语句返回-1 --------------------编程问答-------------------- 多执行一条命令:set   nocount   off以后就能返回正常值了,你这人就是不听 --------------------编程问答-------------------- 数据库里执行以下看看么
引用 20 楼 cacanche 的回复:
多执行一条命令:set nocount off以后就能返回正常值了,你这人就是不听
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,