1

我有以下功能:

public T GetScalar<T>(string sql, T defaultValue, SQLParam[] sqlParams = null)
{
    DataTable dt = GetDataTable(sql, sqlParams);
    if (dt.Rows.Count == 0) return defaultValue;
    else
    {
        try
        {
            object tmp = dt.Rows[0][0];
            return (T)tmp;
        }
        catch { return defaultValue; }
    }
}

我得到一个InvalidCastException.

在调试过程中,我可以看到 的值为tmp3,T类型为int.

这里有什么问题?

编辑

一点背景知识:这曾经在 MySQL 中工作。我现在已经转移到 SQLServer(谢天谢地几乎没有努力),但是这段代码现在失败了。

4

3 回答 3

3

尝试更改您的线路:

return (T)tmp;

return (T) Convert.ChangeType(tmp, typeof(T));
于 2012-09-04T11:32:55.273 回答
2

我怀疑这个值实际上是a long,或者类似的东西——当你拆箱时,你必须拆箱到确切的类型(签名和枚举有一些奇怪的地方,但不是longvs int)。

如果您戴上手表,您应该能够看到这一点tmp.GetType()- 或者只是从 SQL 中确定它应该是什么类型。

于 2012-09-04T11:30:16.450 回答
1

尝试将try块中的代码更改为:

        T tmp = dt.Rows[0].Field<T>(0);
        return tmp;

看看这是否有效 - 或者至少会给你一个更好的错误。:-)

于 2012-09-04T11:39:46.533 回答