1

我的登录页面中有两个实例,具体取决于作为增值税返回的内容(从下面的存储过程中返回变量),当我在服务器上执行存储过程时,结果是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
4

2 回答 2

0

有几种方法可以从存储过程中返回数据 - 您可以使用RETURN,可以执行普通SELECT操作,还可以使用 out 参数。访问这些值的方式不同,取决于用于执行查询的方法 - ExecuteScalar, , ... -。ExecuteNonQuery它还受到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();
    }
}
于 2013-01-08T16:54:58.927 回答
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;
于 2013-01-08T15:11:20.160 回答