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ます。

デバッグ中に、 の値tmpが 3 であり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 に答える