运营网站时出现异常消息
“无法将'System.DBNull'类型的对象强制转换为类型 'System.String'。“
从以下代码中'return (string)c.Parameters["@vat"].Value;
'的'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;
}
简化程序
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
答案 0 :(得分:2)
直接返回参数值,假设您的存储过程总是会找到参数@code
的记录,而列vattable
永远不会为空。
您可以看到并非如此,并且您获得DBNull
作为回报
您应该将代码更改为
return (c.Parameters["@vat"].Value == DBNull.Value ?
null :
c.Parameters["@vat"].Value.ToString());
当然,假设null
是其余代码的允许/预期返回值
否则,您可以将null
替换为另一个可接受的值(例如string.Empty)
答案 1 :(得分:0)
您可以使用:
return String.Format("{0}",c.Parameters["@vat"].Value);
代替。
答案 2 :(得分:0)
return (string)(c.Parameters["@vat"].Value == DBNull.Value
? null
: c.Parameters["@vat"].Value);