存储过程和返回变量的值不同

时间:2013-01-08 15:06:59

标签: c# sql sql-server

我的登录页面中有两个实例,具体取决于作为vat返回的内容(从下面的存储过程返回变量),当我在服务器上执行存储过程时,结果是INTERNAL,但条件是else上的INTERNAL在登录页面上执行而不是string usertype = u.ViewUserType((int)Session["Id"]); string vattype = u.ViewUserVat((string)Session["Code"]); if (usertype == "Client") { if (vattype == "INTERNAL") { Response.Redirect("~/NonIFAClient/"); } else { Response.Redirect("~/Client/"); } } public string ViewUserVat(string code) { CamOnlineAccess.Utilities u = new CamOnlineAccess.Utilities(); SqlCommand c = u.GetCommandSP("dbo.ViewUserVat"); c.Parameters.AddRange(new System.Data.SqlClient.SqlParameter[] { new System.Data.SqlClient.SqlParameter("@code",System.Data.SqlDbType.VarChar,50), new System.Data.SqlClient.SqlParameter("@vat",SqlDbType.VarChar, 50, System.Data.ParameterDirection.Output, false, ((byte)(0)), ((byte)(0)), "", System.Data.DataRowVersion.Current, null)}); c.Parameters["@code"].Value = code; c.Connection.Open(); c.ExecuteScalar(); // because we have output parameters c.Connection.Close(); return (string)c.Parameters["@vat"].Value; }

ALTER PROCEDURE [dbo].[ViewUserVat] 
      -- Add the parameters for the stored procedure here
      @code varchar,
      @vat varchar(50) output
AS
  SELECT 
      TOP 1 @vat = vattable 
  FROM
      dbo.portfolio 
  WHERE
      owner = @code

存储过程:

{{1}}

2 个答案:

答案 0 :(得分:0)

在比较中可能存在空格或投射问题

尝试

c.ExecuteScalar();//because we have output parameters
c.Connection.Close();

String value = (string)c.Parameters["@vat"].Value;

value = value.Trim().ToUpper();

return (string)c.Parameters["@vat"].Value;

答案 1 :(得分:0)

有几种方法可以从存储过程返回数据 - 您可以使用RETURN,可以执行普通SELECT,并且可以使用输出参数。访问此值的方法有所不同,具体取决于方法 - ExecuteScalarExecuteNonQuery,... - 用于执行查询。它还受SET NOCOUNT影响,如果返回受影响的行数,甚至 - 如果我没记错的话 - 是声明存储过程的方式。

自从我上次不得不弄乱这件事以来,已经有一段时间了,我不记得所有的细节,也不知道有一个全面的清单给出了所有细节。但我确信以下内容适用于您的情况。

更改存储过程以返回单列

的单行
ALTER PROCEDURE [dbo].[ViewUserVat] 
      @code varchar
AS
  SELECT 
      TOP 1 vattable 
  FROM
      dbo.portfolio 
  WHERE
      owner = @code

并使用ExecuteScalar()返回的值。

public String ViewUserVat(String code)
{
    var command = CamOnlineAccess.Utilities().GetCommandSP("dbo.ViewUserVat"))

    try
    {
        command.Parameters.AddWithValue("@code", code);

        command.Connection.Open();

        return (String)command.ExecuteScalar();
    }
    finally
    {            
        command.Connection.Close();

        command.Dispose();
    }
}