1

サーバー上でストアド プロシージャを実行すると結果はINTERNAL.ページ。elseINTERNAL

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

たぶん、比較にスペースやキャストの問題があります

試す

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 に答える
0

ストアド プロシージャからデータを返す方法はいくつかありRETURNますSELECT。この値にアクセスする方法は異なり、クエリの実行に使用されるメソッド (、、、... ExecuteScalar)によって異なります。また、影響を受ける行の数が返されるかどうか、および記憶が正しければ、ストアド プロシージャが宣言される方法を制御することExecuteNonQueryによっても影響を受けます。SET NOCOUNT

最後にこれをいじらなければならなかったのはかなりの時間であり、すべての詳細を思い出せず、すべての詳細を示す包括的なリストを認識していません. しかし、私は次のことがあなたのケースでうまくいくはずだと確信しています。

ストアド プロシージャを変更して、1 つの列を含む 1 つの行を返す

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 に答える