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

C# 存储过程和返回变量中的值不同,c#,sql,sql-server,C#,Sql,Sql Server,我的登录页面中有两个实例,具体取决于返回的vat(下面存储过程中的返回变量),当我在服务器上执行存储过程时,结果是INTERNAL,但在登录页面上执行else上的条件,而不是INTERNAL string usertype = u.ViewUserType((int)Session["Id"]); string vattype = u.ViewUserVat((string)Session["Code"]); if (usertype == "

我的登录页面中有两个实例,具体取决于返回的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

比较中可能存在空格或铸造问题

试一试


从存储过程返回数据有几种方法-可以使用
返回
,可以执行简单的
选择
,也可以使用out参数。访问此值的方式不同,具体取决于方法-
ExecuteScalar
ExecuteNonQuery
,…-用于执行查询。它还受到控制是否返回受影响行的数量以及(如果我没记错的话)存储过程声明方式的影响

自从我上次不得不处理这件事以来,已经有一段时间了,我记不清所有的细节,也不知道有一份全面的清单列出了所有的细节。但我很肯定以下几点对你的情况是有效的

更改存储过程以返回一行一列

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();
    }
}

您没有提供的明显信息是,在进行比较时,
vattype
的值是多少?另一个想法是区分大小写是否是一个问题。您以前使用过linq吗?它哪里出了问题?存储过程是否返回了错误的值?SqlCommand是否返回了错误的值?值是否如预期的那样无处不在,但仍然是错误的分支?您的存储过程不会返回实际的数据集-因此,您不应该调用
.ExecuteScalar()
,而应该使用
.ExecuteNonQuery()
来运行存储过程
ExecuteScalar
用于查询/存储过程仅返回一行、一列(如
SELECT COUNT(*)…
或类似内容),因为返回的数据集(不是通过输出参数)应为“内部”。。。但实际价值是什么?我猜它是
DBNull.Value
。谢谢,但是上面的代码将“无法将类型为”System.DBNull的对象强制转换为类型为“System.String”异常。@danny如果存储过程返回DBNull,其他对象将被执行,这不是很明显吗?我知道这很明显,但我的问题是“为什么”。在服务器上运行存储过程查询时,结果(vat)是“内部”而不是DBNull。但当我运行网站时,返回的值为空。这就是问题所在。不管怎样,检查我哪里出了问题。。??
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();
    }
}