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.ExecuteScalre() 方法名不晓得写错没有。
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);
成功了 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
对于update,insert,delete而言ExecuteNonQuery是不存在问题的,这里的问题仅仅是对select而言的
int rows = cmd.ExecuteNonQuery();
有的人就说了,我仅仅是调用一个简单的存储过程,怎么还是返回-1呢?这个是由于Visual Studio引起的。我们在Visual Studio中写了一个存储过程时,它会被默认加上set nocount on。这样就导致了调用存储过程时始终得不到影响的行数,而返回-1。不过我在Visual Studio 2008 Team Suit中测试了下,这个问题不存在了。可能以前的版本有这样的问题吧(未测试),碰到这种情况就多留意些
ExecuteNonQuery()对select语句返回-1