の単一の列という値を返すクエリに対して、T型のコレクションを取得するメソッドを記述しようとしています。SqlDataReaderからIEnumerableへ<T>
public static IEnumerable<T> ExecuteReader<T>(string query)
{
using (SqlConnection cn = new SqlConnection(conn.ConnectionString))
{
cn.Open();
using (SqlCommand cmd = new SqlCommand(query, cn))
{
using (SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
yield return (T)reader[0];
}
}
}
}
使用例:
foreach (var dbname in ExecuteReader<string>("SELECT Name FROM sys.databases"))
{
//iterate db names
}
問題は今、私は、のtry/catchでコードにエラー処理を追加したいのですが、私がこれまで試したどのような
次のようなもの:
try
{
//my code
}
catch
{
//Error handling code
return Enumerable.Empty<T>();
}
利回りはtry/catchと互換性がありません。
IDataReaderクラスの拡張機能を作成するなど、Web上でいくつかの選択肢が見られましたが、旧式になる可能性があるので、これを実現するための提案や改善方法が公開されています。
EDIT:
私は答えのように感じるが、多分私は自分自身を明確にするdidntは、質問自体から逸脱しています。 try-catchまたはの出力は、私にはとは関係ありません。これはコードを書いた後に見つけられた小さな障害です。
私が知りたいのは、これが、汎用タイプの単一の列が取り出されたデータウェアハウスからリストを取り込む正しい方法であるかどうかです。
したがって、yieldを使用せず、すべてをリストに入れてからlistを返します。 – Niewidzialny
'try {} catch {return Enumerable.Empty()}'はエラー処理ではありません。 –
Evk
@Evkこれは単なる例であり、いくつかのログにエラーメッセージを登録したいと考えています – Innat3