Существует базовый класс для доступа к данным, который выполняет все соединения и sql вещи:
public class DataAccessBase
{
protected DataAccessBase(string connectionString)
{
InitSqlConnection(connectionString, byName);
}
protected void InitSqlConnection(string connectionString, bool byName = false)
{
Connection = new SqlConnection(byName ? ConnectionStringMapper.Current.GetConnectionStringByName(connectionString) : connectionString);
}
protected SqlCommand CreateSqlCmd(string sqlQuery)
{
return new SqlCommand(sqlQuery, Connection);
}
protected DataTable GetDataTable(SqlCommand sqlCmd)
{
sqlCmd.Transaction = _transaction;
DataTable dataTable = new DataTable();
using (SqlDataAdapter adapter = new SqlDataAdapter(sqlCmd))
adapter.Fill(dataTable);
return dataTable;
}
}
Теперь в производном классе я написал метод, который извлекает данные:
internal IEnumerable<string> GetData()
{
StringBuilder sql = new StringBuilder(@" SELECT ... FROM [...] ");
SqlCommand cmd = CreateSqlCmd(sql);
DataTable dataTable = base.GetDataTable(cmd);
foreach(DataRow row in dataTable.Rows)
yield return row["FileString"].ToString();
}
Этот метод не работает. При отладке до base.GetDataTable
, в cmd.Connection
, ConnectionString
пусто.
Но когда я использую
return from DataRow row in dataTable.Rows select row["FileString"].ToString()
вместо итерации dataTable.Rows
и yield return row["FileString"].ToString()
, ConnectionString
правильно.
Есть идеи, что за проблема здесь с yield return
? И почему ConnectionString
пуст? Имхо, это не должно иметь значения, уступая или нет.
edit:
, когда я перемещаю итерации и уступки к дополнительной функции и вызываю ее, это работает. Что-то вроде:
internal IEnumerable<string> GetData()
{
StringBuilder sql = new StringBuilder(@" SELECT ... FROM [...] ");
SqlCommand cmd = CreateSqlCmd(sql);
DataTable dataTable = base.GetDataTable(cmd);
return _toEnumerable(dataTable);
}
private IEnumerable<string> _toEnumerable(DataTable table)
{
foreach(DataRow row in table.Rows)
yield return row["FileString"].ToString();
}
Не имеет смысла - не так ли?