当前位置:  开发笔记 > 编程语言 > 正文

从C#中的存储过程获取返回值

如何解决《从C#中的存储过程获取返回值》经验,为你挑选了4个好方法。

我有以下查询:

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER PROCEDURE [dbo].[Validate]
@a varchar(50),
@b varchar(50) output

AS

SET @Password = 
(SELECT Password
FROM dbo.tblUser
WHERE Login = @a)

RETURN @b
GO

这个编译完全没问题.

在C#中,我想执行此查询并获取返回值.

我的代码如下:

  SqlConnection SqlConn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["MyLocalSQLServer"].ConnectionString.ToString());
        System.Data.SqlClient.SqlCommand sqlcomm = new System.Data.SqlClient.SqlCommand("Validate", SqlConn);

        string returnValue = string.Empty;

        try
        {
            SqlConn.Open();
            sqlcomm.CommandType = CommandType.StoredProcedure;

            SqlParameter param = new SqlParameter("@a", SqlDbType.VarChar);
            param.Direction = ParameterDirection.Input;
            param.Value = Username;
            sqlcomm.Parameters.Add(param);



            SqlParameter retval = sqlcomm.Parameters.Add("@b", SqlDbType.VarChar);
            retval.Direction = ParameterDirection.ReturnValue;


            string retunvalue = (string)sqlcomm.Parameters["@b"].Value;

注意:异常处理会缩短以保持代码简短.每当我到达最后一行时,返回null.这段代码的逻辑错误是什么?

谢谢



1> Joel Coehoor..:

Mehrdad提出了一些好处,但我注意到的主要问题是你从未运行过查询 ......

SqlParameter retval = sqlcomm.Parameters.Add("@b", SqlDbType.VarChar);
retval.Direction = ParameterDirection.ReturnValue;
sqlcomm.ExecuteNonQuery(); // MISSING
string retunvalue = (string)sqlcomm.Parameters["@b"].Value;


在最后一行中,您是否可以将`sqlcomm.Parameters [“ @ b”]`替换为`retval`?
我不是在问有关我正在处理的代码的问题,我正在努力帮助您改善对未来读者的回答。

2> Mehrdad Afsh..:
retval.Direction = ParameterDirection.Output;

ParameterDirection.ReturnValue应该用于程序的"返回值",而不是输出参数.它获取SQL RETURN语句返回的值(名称为参数@RETURN_VALUE).

而不是RETURN @b你应该SET @b = something

顺便说一句,返回值参数总是int,而不是字符串.



3> Alan Jackson..:

我在返回值方面遇到了很多麻烦,所以我最后只选择了一些东西.

解决方案只是在结尾处选择结果并在您的功能中返回查询结果.

在我的情况下,我正在进行存在检查:

IF (EXISTS (SELECT RoleName FROM dbo.Roles WHERE @RoleName = RoleName)) 
    SELECT 1
ELSE
    SELECT 0

然后

using (SqlConnection cnn = new SqlConnection(ConnectionString))
{
    SqlCommand cmd = cnn.CreateCommand();
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandText = "RoleExists";
    return (int) cmd.ExecuteScalar()
}

您应该能够使用字符串值而不是int来执行相同的操作.



4> Manatherin..:

这是建立在Joel和Mehrdad的答案上的:你永远不会将参数绑定retvalsqlcommand.你需要一个

sqlcomm.Parameters.Add(retval);

并确保您正在运行该命令

sqlcomm.ExecuteNonQuery();

我也不确定为什么你有2个返回值字符串(returnValueretunvalue).

推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有