2013-01-08 64 views
1

我在登錄頁面中有兩個實例,具體取決於作爲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

您未提供的顯而易見的信息是當您進行比較時'vattype'的值是多少?另一個想法是區分大小寫是否是一個問題。 – Chris

+0

你以前用過linq嗎? – CR41G14

+0

它出錯了?存儲過程是否返回錯誤的值? SqlCommand是否返回錯誤的值?預期的價值無處不在,但仍然是錯誤的分支? –

回答

0

也許有空格或鑄造問題在comparrisson

嘗試

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; 
+0

謝謝,但上面的代碼會拋出'無法轉換'System.DBNull'類型的對象來鍵入'System.String''異常。 – danny

+0

@danny如果存儲過程返回DBNull,那麼其他部分是否會執行? – Destrictor

+0

我知道這很明顯,但'爲什麼'是我的問題。當我在服務器上運行存儲過程查詢時,結果(vat)是'INTERNAL'而不是DBNull。但是當我運行網站時,返回的值爲空。這就是問題。無論如何檢查我要去哪裏錯了.. ?? – danny

0

有從存儲過程返回數據的幾種方法 - 你可以使用RETURN,你可以執行一個普通的SELECT和y你可以使用輸出參數。訪問此值的方法不同,取決於方法 - 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(); 
    } 
}