首页 新闻 会员 周边 捐助

sql 语句编程 存储过程参数获取不到值

0
悬赏园豆:20 [已解决问题] 解决于 2015-08-24 14:51

问题说明:

通过C#调用存储过程,问题出在这句:IF @user_Balance - @number > 0过不去,直接就跳到:SELECT 'NOT_ENOUGH'; --金币余额卖出不足

直接在数据库中执行储存过程:exec [P_Admin_GoldSell_OfflinePay] '201507160000000001' (注:@serialno=201507160000000001)运行到 IF @user_Balance - @number > 0这句是没问题的,因为表中的数据@user_Balance确实大于@number 

请求园友帮忙看看,谢谢!

代码如下:

 1 ALTER PROC [dbo].[P_Admin_GoldSell_OfflinePay]
 2 @serialno varchar(50)
 3 AS
 4 BEGIN
 5     DECLARE @userID VARCHAR(50);
 6     DECLARE @status INT;
 7     DECLARE @number DECIMAL(18,3);
 8     DECLARE @user_Balance DECIMAL(18,3);
 9      
10     SELECT @userID = userID, @number = number,@status = [status] FROM fr_cus_gold_sellLog WHERE serialno = @serialno;
11     SELECT @user_Balance = balance_free FROM fr_customer WHERE userID = @userID ;
12      
13     IF @status != 1
14     BEGIN
15         SELECT 'COMPLETED';
16         RETURN;
17     END
18      
19     IF @user_Balance - @number > 0 --判断用户金币余额的65%减去要提现的金币是否大于0
20     BEGIN
21         PRINT '足额'
22         DECLARE @ROWCOUNT INT;
23         SET @ROWCOUNT = 0;
24         BEGIN TRAN;
25         UPDATE fr_cus_gold_sellLog SET [status] = 2 WHERE serialno = @serialno;
26         SET @ROWCOUNT = @ROWCOUNT + @@ROWCOUNT;
27         --UPDATE fr_customer SET balance_free = balance_free - @number WHERE userID = @userID;
28         --SET @ROWCOUNT = @ROWCOUNT + @@ROWCOUNT;
29          
30         IF @ROWCOUNT = 1
31         BEGIN
32             COMMIT TRAN;
33             SELECT 1;
34         END
35         ELSE
36         BEGIN
37             ROLLBACK TRAN;
38             SELECT 0;
39         END
40     END
41     ELSE
42     BEGIN
43         UPDATE fr_cus_gold_sellLog SET [status] = 3 WHERE serialno = @serialno;
44         SELECT 'NOT_ENOUGH';    --金币余额卖出不足
45     END
46 END
文__武的主页 文__武 | 菜鸟二级 | 园豆:203
提问于:2015-08-20 17:27
< >
分享
最佳答案
0

直接在数据库中执行储存过程而用C#代码调用不行的话   那么除了配置就是传值的问题啦

检查从C#传值过来的参数类型或者参数长度是不是能够保证你想要的值不会被截取或者什么的

收获园豆:10
小白菜T | 小虾三级 |园豆:564 | 2015-08-21 09:30

这个也检查了,需要传输的参数@serialno,是能够在通过调用存储过程,在程序里面返回对应值的,只是存储过程中的变量无法获取到值。

数据类型和长度都没有问题。

文__武 | 园豆:203 (菜鸟二级) | 2015-08-21 10:05

@文__武: 之前我遇到过一个类似的问题  在C#代码里面调试时看到的正确的  但是调用存储过程就有问题   原因是在C#中设置存储过程参数时的参数长度不对

 

还是建议你报调用存储过程那部分的代码贴出来   大家好集思广益出主意啊

小白菜T | 园豆:564 (小虾三级) | 2015-08-21 11:49

@小白菜T: 

这样确没问题…………好无语

 1 ALTER PROC [dbo].[P_Admin_GoldSell_OfflinePay]
 2 @serialno varchar(50) output
 3 AS
 4 BEGIN
 5     DECLARE @userID VARCHAR(50);
 6     DECLARE @status INT;
 7     DECLARE @number DECIMAL(18,3);
 8     DECLARE @user_Balance DECIMAL(18,3);
 9     
10     SELECT @userID = userID FROM fr_cus_gold_sellLog WHERE serialno = '201505180000000001';  --@serialno
11     --SELECT @user_Balance = balance_free FROM fr_customer WHERE userID = @userID ;
12     
13     SELECT @serialno+'----'+@userID;
14 END

返回的值:

文__武 | 园豆:203 (菜鸟二级) | 2015-08-22 16:41
其他回答(6)
0

要加括号吧

create proc usp_aa @n1 decimal(18,3), @n2 decimal(18,3) as begin     if(@n1-@n2)>0     print('成功')     else     print('失败') end

exec usp_aa 12,14

不是这个问题,值肯定没有取到

收获园豆:2
唯我独萌 | 园豆:537 (小虾三级) | 2015-08-20 17:39

和括号有什么关系, 这种多数是有数据没有取到。别误导。

支持(0) 反对(0) gw2010 | 园豆:1487 (小虾三级) | 2015-08-20 17:46

@gw2010: 

嗯,这个我考虑和测试了

直接在数据库中执行储存过程:exec [P_Admin_GoldSell_OfflinePay] '201507160000000001'

是可以的,我在后台操作的就是:@serialno=201507160000000001

支持(0) 反对(0) 文__武 | 园豆:203 (菜鸟二级) | 2015-08-20 21:38
0

在if 前面 把两个 select @user_Balance , @number 出来, 是false的结果

fr_cus_gold_sellLog这个表里没有写记录呢?

收获园豆:2
gw2010 | 园豆:1487 (小虾三级) | 2015-08-20 17:46

嗯,这个我考虑和测试了

直接在数据库中执行储存过程:exec [P_Admin_GoldSell_OfflinePay] '201507160000000001'

是可以的,我在后台操作的就是:@serialno=201507160000000001

支持(0) 反对(0) 文__武 | 园豆:203 (菜鸟二级) | 2015-08-20 21:38
0

你得学会sql调试,不然别人没有数据没法帮你的。

 1 ALTER PROC [dbo].[P_Admin_GoldSell_OfflinePay]
 2 @serialno varchar(50)
 3 AS
 4 BEGIN
 5     DECLARE @userID VARCHAR(50);
 6     DECLARE @status INT;
 7     DECLARE @number DECIMAL(18,3);
 8     DECLARE @user_Balance DECIMAL(18,3);
 9      
10     SELECT @userID = userID, @number = number,@status = [status] FROM fr_cus_gold_sellLog WHERE serialno = @serialno;
11     SELECT @user_Balance = balance_free FROM fr_customer WHERE userID = @userID ;
12      
13     IF @status != 1
14     BEGIN
15         SELECT 'COMPLETED';
16         RETURN;
17     END
      
--- 这儿加一句
Select @user_Balance, @number

19     IF @user_Balance - @number > 0 --判断用户金币余额的65%减去要提现的金币是否大于0
20     BEGIN
21         PRINT '足额'
22         DECLARE @ROWCOUNT INT;
23         SET @ROWCOUNT = 0;
24         BEGIN TRAN;
25         UPDATE fr_cus_gold_sellLog SET [status] = 2 WHERE serialno = @serialno;
26         SET @ROWCOUNT = @ROWCOUNT + @@ROWCOUNT;
27         --UPDATE fr_customer SET balance_free = balance_free - @number WHERE userID = @userID;
28         --SET @ROWCOUNT = @ROWCOUNT + @@ROWCOUNT;
29          
30         IF @ROWCOUNT = 1
31         BEGIN
32             COMMIT TRAN;
33             SELECT 1;
34         END
35         ELSE
36         BEGIN
37             ROLLBACK TRAN;
38             SELECT 0;
39         END
40     END
41     ELSE
42     BEGIN
43         UPDATE fr_cus_gold_sellLog SET [status] = 3 WHERE serialno = @serialno;
44         SELECT 'NOT_ENOUGH';    --金币余额卖出不足
45     END
46 END
收获园豆:2
爱编程的大叔 | 园豆:30844 (高人七级) | 2015-08-20 18:42

嗯,我调试过了,数据这块能保证是有的,因为不通过程序调用,直接通过数据库,以sql语句调用,其中的操作都能完成。搞不懂是什么原因,好纠结!

支持(0) 反对(0) 文__武 | 园豆:203 (菜鸟二级) | 2015-08-21 10:02

这样确没问题…………好无语

1 ALTER PROC [dbo].[P_Admin_GoldSell_OfflinePay] 2 @serialno varchar(50) output 3 AS 4 BEGIN 5 DECLARE @userID VARCHAR(50); 6 DECLARE @status INT; 7 DECLARE @number DECIMAL(18,3); 8 DECLARE @user_Balance DECIMAL(18,3); 9 10 SELECT @userID = userID FROM fr_cus_gold_sellLog WHERE serialno = '201505180000000001'; --@serialno 11 --SELECT @user_Balance = balance_free FROM fr_customer WHERE userID = @userID ; 12 13 SELECT @serialno+'----'+@userID; 14 END

返回的值:

支持(0) 反对(0) 文__武 | 园豆:203 (菜鸟二级) | 2015-08-22 16:42

这样确没问题…………好无语

 1 ALTER PROC [dbo].[P_Admin_GoldSell_OfflinePay]
 2 @serialno varchar(50) output
 3 AS
 4 BEGIN
 5     DECLARE @userID VARCHAR(50);
 6     DECLARE @status INT;
 7     DECLARE @number DECIMAL(18,3);
 8     DECLARE @user_Balance DECIMAL(18,3);
 9     
10     SELECT @userID = userID FROM fr_cus_gold_sellLog WHERE serialno = '201505180000000001';  --@serialno
11     --SELECT @user_Balance = balance_free FROM fr_customer WHERE userID = @userID ;
12     
13     SELECT @serialno+'----'+@userID;
14 END

 程序返回的值alert信息:

支持(0) 反对(0) 文__武 | 园豆:203 (菜鸟二级) | 2015-08-22 16:45
0

会不会是c#代码问题,粘出来看看。

收获园豆:2
火悬崖 | 园豆:434 (菜鸟二级) | 2015-08-21 08:54

这个也调试过了,能过程序调用,是能返回数据的,只是一直返回:SELECT 'NOT_ENOUGH';

支持(0) 反对(0) 文__武 | 园豆:203 (菜鸟二级) | 2015-08-21 10:03

@文__武: 介意把那段c#代码粘出来看看吗?

支持(0) 反对(0) 火悬崖 | 园豆:434 (菜鸟二级) | 2015-08-21 11:45
0

自己顶一个,求助园友。

文__武 | 园豆:203 (菜鸟二级) | 2015-08-21 10:10
0

数据库连错了没

收获园豆:2
清海扬波 | 园豆:825 (小虾三级) | 2015-08-22 17:56

园友,麻烦认真看看上面的回复和我帖子问题的说明…………

支持(0) 反对(0) 文__武 | 园豆:203 (菜鸟二级) | 2015-08-24 10:01
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册