我想寫一個方法,爲一個查詢返回一個單值列值的類型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類編寫擴展,但我覺得他們可能已經過時,所以我願意接受建議或更好的方法來實現這一點。
編輯:
我覺得答案是從問題本身偏離,也許我沒有說清楚。 try-catch或收益率與我無關,這只是我編寫我的代碼後發現的一個小障礙。
我想知道的是,如果這是從datareader填充列表的正確方式,其中檢索一列泛型類型。
所以不要使用yield,並把所有列表,然後返回列表。 – Niewidzialny
請注意'try {} catch {return Enumerable.Empty()}'_不是錯誤處理。 –
Evk
@Evk僅僅是一個例子,我也想把錯誤信息註冊到一些日誌中 – Innat3