问题说明:
通过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
直接在数据库中执行储存过程而用C#代码调用不行的话 那么除了配置就是传值的问题啦
检查从C#传值过来的参数类型或者参数长度是不是能够保证你想要的值不会被截取或者什么的
这个也检查了,需要传输的参数@serialno,是能够在通过调用存储过程,在程序里面返回对应值的,只是存储过程中的变量无法获取到值。
数据类型和长度都没有问题。
@文__武: 之前我遇到过一个类似的问题 在C#代码里面调试时看到的正确的 但是调用存储过程就有问题 原因是在C#中设置存储过程参数时的参数长度不对
还是建议你报调用存储过程那部分的代码贴出来 大家好集思广益出主意啊
@小白菜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
返回的值:
要加括号吧
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
不是这个问题,值肯定没有取到
和括号有什么关系, 这种多数是有数据没有取到。别误导。
@gw2010:
嗯,这个我考虑和测试了
直接在数据库中执行储存过程:exec [P_Admin_GoldSell_OfflinePay] '201507160000000001'
是可以的,我在后台操作的就是:@serialno=201507160000000001
在if 前面 把两个 select @user_Balance , @number 出来, 是false的结果
fr_cus_gold_sellLog这个表里没有写记录呢?
嗯,这个我考虑和测试了
直接在数据库中执行储存过程:exec [P_Admin_GoldSell_OfflinePay] '201507160000000001'
是可以的,我在后台操作的就是:@serialno=201507160000000001
你得学会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
嗯,我调试过了,数据这块能保证是有的,因为不通过程序调用,直接通过数据库,以sql语句调用,其中的操作都能完成。搞不懂是什么原因,好纠结!
这样确没问题…………好无语
返回的值:
这样确没问题…………好无语
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信息:
会不会是c#代码问题,粘出来看看。
这个也调试过了,能过程序调用,是能返回数据的,只是一直返回:SELECT 'NOT_ENOUGH';
@文__武: 介意把那段c#代码粘出来看看吗?
自己顶一个,求助园友。
数据库连错了没
园友,麻烦认真看看上面的回复和我帖子问题的说明…………