2010-11-28 8 views
0

誰もが知っているように、SqlClientクラスは、objectを返すExecuteScalarメソッドをデータベースから取得する方法として提供しています。適切にキャストするのは大したことではありませんが、適切に型指定されたオブジェクトを返す厳密に型指定されたバージョンを作成したいと考えました。これはブール値とDateTime秒間非常にうまく機能DALのExecuteScalarの実装に型パラメータを追加するにはどうすればよいですか?

public T ExecuteScalar<T>(IDbCommand cmd) where T : struct 
{ 
    cmd.Connection = this.conn; 
    object o = cmd.ExecuteScalar(); 
    return (T)o; 
} 

:だから、私は、次のC#を書きました。ただし、整数の場合はInvalidCastExceptionがスローされます。だから、リフレクターのコピーで武装している人は、Field<T>(this DataRow, string columnName)拡張メソッドに参加したことをやった。要求された型に値を変換してテストするために使用する内部クラスを切り出しました。しかし、値の型の場合、コードはちょうどreturn (T)value;です。これはもちろん役に立ちません。

私の質問:誰も私のメソッドがすべての値の型と文字列の値を適切に返すようにする方法について考えている人はいますか?ブール値の文字列でも、DateTimeとintは問題ありません。

ありがとうございます!

+0

FYI: 'string'は参照型です。 –

+0

また、クエリが結果を返さない場合、キャストエラーが発生する可能性があります。 –

+0

本当にありがとうございます。そして、いいえ、クエリーの結果が間違いなく返されます - 私はこの例外を手動で発生させたものを実行し、うまく動作します。 – benjy

答えて

3

クエリでは、異なる数値型のボックス化されたインスタンスが返されます(おそらくdecimal)。

You cannot unbox it and convert it to int in one operation

代わりに、あなたはConvert.ChangeTypeを呼び出すことができます。

返された値が実際に整数の場合、キャストは、[OK]をする必要がありますあなたのコードを見てみると
return o is t ? (T)o : (T)Convert.ChangeType(o, typeof(T)); 
+0

それは、ありがとう!非常に役立ちます。 – benjy

0

おそらく、データベースからNULLが返されますか?その場合、oはDBNull.Valueになります。これはキャストする前に考慮する必要があります。簡単な方法はint?を使用するか、その場合に例外をスローすることができます。

nullが問題でない場合は、ExceuteScalar呼び出しの後に具体的なタイプのoをポストしてみてください。

0

返されるオブジェクトが整数でない場合(float、double、byteなどの場合)、オブジェクトにボックス化され、元の型にのみキャストできます。タイプを確認してくださいo

関連する問題