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

仰望那天空 2015-08-21 02:47:35
代码如下:

通过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

请大神们指教


ALTER PROC [dbo].[P_Admin_GoldSell_OfflinePay]
@serialno varchar(50)
AS
BEGIN
DECLARE @userID VARCHAR(50);
DECLARE @status INT;
DECLARE @number DECIMAL(18,3);
DECLARE @user_Balance DECIMAL(18,3);

SELECT @userID = userID, @number = number,@status = [status] FROM fr_cus_gold_sellLog WHERE serialno = @serialno;
SELECT @user_Balance = balance_free FROM fr_customer WHERE userID = @userID ;

IF @status != 1
BEGIN
SELECT 'COMPLETED';
RETURN;
END

IF @user_Balance - @number > 0 --判断用户金币余额的65%减去要提现的金币是否大于0
BEGIN
PRINT '足额'
DECLARE @ROWCOUNT INT;
SET @ROWCOUNT = 0;
BEGIN TRAN;
UPDATE fr_cus_gold_sellLog SET [status] = 2 WHERE serialno = @serialno;
SET @ROWCOUNT = @ROWCOUNT + @@ROWCOUNT;
--UPDATE fr_customer SET balance_free = balance_free - @number WHERE userID = @userID;
--SET @ROWCOUNT = @ROWCOUNT + @@ROWCOUNT;

IF @ROWCOUNT = 1
BEGIN
COMMIT TRAN;
SELECT 1;
END
ELSE
BEGIN
ROLLBACK TRAN;
SELECT 0;
END
END
ELSE
BEGIN
UPDATE fr_cus_gold_sellLog SET [status] = 3 WHERE serialno = @serialno;
SELECT 'NOT_ENOUGH'; --金币余额卖出不足
END
END


前几天发过这个问题,但没解决,还没结贴,访问下面的帖子也可以回答给分:
http://bbs.csdn.net/topics/391813424
...全文
198 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
仰望那天空 2015-08-24
  • 打赏
  • 举报
回复
引用 9 楼 Tiger_Zhao 的回复:
有返回证明不了什么?
SELECT serialno,@serialno FROM fr_cus_gold_sellLog WHERE serialno = '201505180000000001';
你把返回的这两个值输出,并且输出相等比较的结果。
粗心了,终于找到问题了,非常感谢! 结贴结贴!!!!
Tiger_Zhao 2015-08-24
  • 打赏
  • 举报
回复
有返回证明不了什么?
SELECT serialno,@serialno FROM fr_cus_gold_sellLog WHERE serialno = '201505180000000001';

你把返回的这两个值输出,并且输出相等比较的结果。
仰望那天空 2015-08-24
  • 打赏
  • 举报
回复
引用 7 楼 Tiger_Zhao 的回复:
A)你C#中SqlParameter的长度不正确。
B)serialno字段类型不是varchar(50),和@serialno比较需要隐式转换为字符串,转换用的不是'201505180000000001'这样的格式(比如用了科学记数法),比较就不等了。



ALTER PROC [dbo].[P_Admin_GoldSell_OfflinePay]
@serialno varchar(50)
AS
BEGIN
DECLARE @userID VARCHAR(50);
DECLARE @status INT;
DECLARE @number DECIMAL(18,3);
DECLARE @user_Balance DECIMAL(18,3);

SELECT @serialno; --直接这样返回,在程序后台是可以alert出来这个值的。

END


表中字段的数据类型:

Tiger_Zhao 2015-08-24
  • 打赏
  • 举报
回复
A)你C#中SqlParameter的长度不正确。
B)serialno字段类型不是varchar(50),和@serialno比较需要隐式转换为字符串,转换用的不是'201505180000000001'这样的格式(比如用了科学记数法),比较就不等了。
仰望那天空 2015-08-22
  • 打赏
  • 举报
回复
经过测试,请看如下代码: 直接serialno = '201505180000000001';这样,能返回@serialno和@userID参数值; 这样serialno = @serialno; 确不行,上面的@serialno参数返回的值也是对的。这是为何? 难道sql语句后面跟的是参数,而不能执行? 直接赋值才能执行返回数据? 求解呀

SELECT @userID = userID FROM fr_cus_gold_sellLog WHERE serialno = '201505180000000001';  --@serialno
	--SELECT @user_Balance = balance_free FROM fr_customer WHERE userID = @userID ;
	
	SELECT @serialno+'----'+@userID;
仰望那天空 2015-08-22
  • 打赏
  • 举报
回复
引用 4 楼 airsoft 的回复:
这个地方建议这样写,前面有可能没有值,这句就有异常 isnull(@user_Balance,0) - isnull(@number,0) > 0
这里的参数确实返回的空,调试过了。 数据保证是有的。不通过C#调用,直接通过数据库调用存储过程,是没问题的。
Haytor 2015-08-22
  • 打赏
  • 举报
回复
这个地方建议这样写,前面有可能没有值,这句就有异常 isnull(@user_Balance,0) - isnull(@number,0) > 0
仰望那天空 2015-08-21
  • 打赏
  • 举报
回复
引用 1 楼 Tiger_Zhao 的回复:
A)C#是怎么调用的。 B)加连个参数把@user_Balance、@number返回,既然是在C#中确认返回了NOT_ENOUGH,就同时查看下这两个值啊。
嗯,查看过了,这两个参数返回的空。
Tiger_Zhao 2015-08-21
  • 打赏
  • 举报
回复
那就是程序调用错误了。
可能是多次调用,你监视到的正好是不错的那句。
Tiger_Zhao 2015-08-21
  • 打赏
  • 举报
回复
A)C#是怎么调用的。
B)加连个参数把@user_Balance、@number返回,既然是在C#中确认返回了NOT_ENOUGH,就同时查看下这两个值啊。

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧