2013-01-08 63 views
0

期間,當我運行的網站當SQL查詢

有一個例外消息無效的轉換異常「無法投類型的對象‘System.DBNull’鍵入 ‘System.String’。」

從下面的代碼中''return (string)c.Parameters["@vat"].Value;'的'值'部分開始改變。我檢查了存儲過程以查看它是否執行查詢,它的確並且它的輸出也是一個字符串。任何人都可以幫助.. ??

namespace CamOnlineAccess 
{ 
    public class Utilities 
    { 
    public SqlConnection GetConnection() 
    { 
     SqlConnection c = new SqlConnection(); 
     c.ConnectionString = ConfigurationManager.ConnectionStrings["CamOnlineConnectionString"].ConnectionString; 
     return c; 
    } 

    public SqlCommand GetCommandSP(string SPName) 
    { 
     SqlCommand c = new SqlCommand(); 
     c.Connection = GetConnection(); 
     c.CommandType = CommandType.StoredProcedure; 
     c.CommandText = SPName; 
     c.CommandTimeout = 150; 

     return c; 
    } 
    } 
} 

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

STRORED程序

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 [email protected] 

回答

2

您直接返回的參數值,假設您的存儲過程總是會找到一個記錄的參數@code和列vattable永遠不能爲null。

這是不正確的,你可以看到,你得到一個DBNull作爲回報。
您應該更改您的代碼

return (c.Parameters["@vat"].Value == DBNull.Value ? 
       null : 
       c.Parameters["@vat"].Value.ToString()); 

當然,假設null是你的代碼的其餘部分允許的/預期的返回值。
否則,您可以用另一個可接受的值替換null(例如string.Empty)

+0

null將比'string.Empty',IMO更合適。 ''「''='null' –

+0

我認爲返回null而不是空字符串是正確的。 –

+0

好吧,只是假設,改變了答案,以反映@MarcGravell筆記 – Steve

0

您可以使用:

return String.Format("{0}",c.Parameters["@vat"].Value); 

代替。

0
return (string)(c.Parameters["@vat"].Value == DBNull.Value 
      ? null 
      : c.Parameters["@vat"].Value);