ConnectionString пуст при выдаче результатов - PullRequest
0 голосов
/ 09 января 2020

Существует базовый класс для доступа к данным, который выполняет все соединения и 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();
}

Не имеет смысла - не так ли?

...