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

仰望那天空 2015-08-20 11:43:37

CREATE 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 ;

select 'test' return;
END


如上面代码:
现在通过C#调用这个存储过程,其中@serialno参数的值,经调试可以传输进来。
但是这两句:

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 ;

其中的@userID、@number、@status、@user_Balance这些参数都无法获取到值

一开始以为是存储过程写错了或者表里没有相关数据
但是直接打开sql server,通过sql语句:exec [P_Admin_GoldSell_OfflinePay] '201507160000000001' 是能成功的!

麻烦各位帮忙看看,是什么原因造成的?感谢!



...全文
300 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
仰望那天空 2015-08-24
  • 打赏
  • 举报
回复
经过测试,请看如下代码: 直接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
  • 打赏
  • 举报
回复
引用 8 楼 Tiger_Zhao 的回复:
另外一帖找到原因了。
前天一不小自己回复了三次,然后系统就提示我,一个帖子只能同时回复三次,然后不能顶贴了,差点沉了,谢谢楼上顶一下。 问题自己还在解决中。 有哪个大神有什么见意,帮忙留个言吧,谢谢!
Tiger_Zhao 2015-08-21
  • 打赏
  • 举报
回复
另外一帖找到原因了。
  • 打赏
  • 举报
回复
你用sql profiler监控一下,看看当你在c#中执行时,打印出来的语句是怎样的。
仰望那天空 2015-08-20
  • 打赏
  • 举报
回复
求关注,求指教……
仰望那天空 2015-08-20
  • 打赏
  • 举报
回复
引用 2 楼 yangb0803 的回复:
你第一句的查询 WHERE serialno = @serialno 如果没有值时, @userID、@number、@status就每值了
谢谢! 可能我没表述清楚,我贴个完整的代码上来吧:

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
通过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
仰望那天空 2015-08-20
  • 打赏
  • 举报
回复
引用 1 楼 yupeigu 的回复:
你用sql profiler监控一下,看看当你在c#中执行时,打印出来的语句是怎样的。



这是监视到的截图
道玄希言 2015-08-20
  • 打赏
  • 举报
回复
你说的能成功,是不是低下一行提示: “命令已成功完成。” ? 而获取不到值, 是不是说,在C#里面调用该过程,不能取到你要的几个变量值? 你取到值了,也得返回出去啊:


CREATE PROC [dbo].[P_Admin_GoldSell_OfflinePay](
    @serialno varchar(50), 
    @userID VARCHAR(50) output,
    @status INT output,
    @number DECIMAL(18,3) output,
    @user_Balance DECIMAL(18,3) output)
AS
BEGIN
    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 ; 
END

或者
CREATE 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 ;
     
    select @userID as userid, @number as number,
	       @status as status, @user_Balance as user_Balance;   
END

仰望那天空 2015-08-20
  • 打赏
  • 举报
回复
引用 2 楼 yangb0803 的回复:
你第一句的查询 WHERE serialno = @serialno 如果没有值时, @userID、@number、@status就每值了
这个上面已经说明,程序里面是可以得到存储过程返回@serialno值的:select @serialno return;是可以返回的。 只是后面通过sql语句获取到的其它变量值,都返回的空。 相对,直接用数据库,通过exec [P_Admin_GoldSell_OfflinePay] '201507160000000001' 是能成功的!
道玄希言 2015-08-20
  • 打赏
  • 举报
回复
你第一句的查询 WHERE serialno = @serialno 如果没有值时, @userID、@number、@status就每值了

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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