我有一个方法(见下文)
public T ExecuteScalar<T>(string sSql, params SqlParameter[] parameters)
{
if (!string.IsNullOrEmpty(sSql))
{
DataAccess dal = new DataAccess(ConnectionString);
DebugOutput_SQL(sSql, parameters);
object value = null;
value = dal.ExecuteScalar(sSql, parameters);
if (value != null && value != DBNull.Value)
return (T)value;
}
return default(T);
}
我称之为
int32 WorkFlowID = DataProvider.ExecuteScalar<Int32>(sSql);
然后它在“return(T)value”行中给出了一个错误“不要取消对值的修改”,对此有任何建议。
答案 0 :(得分:4)
“不要取消装箱值”听起来像一个奇怪的错误信息。这正是它所说的吗?
我的猜测是ExecuteScalar
返回的是其他类型(long
,double
等),而不是int
。在转换为value.GetType()
之前尝试记录T
。
正如旁注,这:
object value = null;
value = dal.ExecuteScalar(sSql, parameters);
将更简单(IMO):
object value = dal.ExecuteScalar(sSql, parameters);
这里没有必要把它放在两个声明中。
编辑:只是为了澄清,它失败的原因是当您取消装箱值时,您必须取消装箱到实际类型,而不仅仅是具有可用转换的类型。例如,如果您想最终获得int
,则可以执行以下操作:
int x = (int) (decimal) value;
将取消装箱到decimal
,然后将decimal
转换为int
。但在这种情况下,如果可能的话,我只需要指定正确的类型:)
答案 1 :(得分:4)
你可以尝试:
public T ExecuteScalar<T>(string sSql, params SqlParameter[] parameters)
{
if (!string.IsNullOrEmpty(sSql))
{
DataAccess dal = new DataAccess(ConnectionString);
DebugOutput_SQL(sSql, parameters);
object value = null;
value = dal.ExecuteScalar(sSql, parameters);
if (value != null && value != DBNull.Value)
return (T) Convert.ChangeType(value, typeof(T));
}
return default(T);
}
答案 2 :(得分:0)
也许你收到的价值对象是Nullable,在这种情况下你可以做
return ((Nullable<T>)value).Value;