private IEnumerable <stream_access_point> DoStuff(string sql) { var connection = String.Format("Server={0};Port=5432;User Id={1};Database={2};CommandTimeout=60;Password=fakepassword;Timeout=60;", _dbConnection.HostName, _dbConnection.UserName, _dbConnection.DatabaseName); var conn = new NpgsqlConnection(connection); conn.Open(); NpgsqlCommand command = new NpgsqlCommand(sql, conn); try { NpgsqlDataReader dr = command.ExecuteReader(); while (dr.Read()) { var l = new stream_access_point(); // sometimes when a line intercepts a polygon you can // get a point, e.g. the EXACT mouth of a river. // ignore these non-line geometries. l.is_accessible = false; l.linear_offset = 0.0M; l.road_gid = dr.GetInt32(0); l.stream_gid = dr.GetInt32(1); l.street_name = dr.GetString(3); l.centroid_latitude = Convert.ToDecimal(dr.GetDouble(5)); l.centroid_longitude = Convert.ToDecimal(dr.GetDouble(4)); l.linear_offset = Convert.ToDecimal(dr.GetDouble(6)); var asdf = dr.GetFieldDbType(9); var isAccessible = dr.IsDBNull(9) == false?dr.GetBoolean(9) : false; l.is_accessible = isAccessible; l.Geom = dr.GetString(7); // l.IntersectionGeometryType = dr.GetString(6); // var isLineString = String.Equals("Linestring", l.IntersectionGeometryType, // StringComparison.OrdinalIgnoreCase); // if (isLineString == false) // { // yield break; // } // // if (dr.IsDBNull(1)) // { // yield break; // } // // l.StreamId = dr.GetInt32(0); // l.StreamNumber = dr.IsDBNull(1) ? "Unnamed" : dr.GetString(1); // l.StreamName = dr.IsDBNull(2) ? "" : dr.GetString(2); // l.GeometryName = dr.IsDBNull(3) ? "" : dr.GetString(3); // var asdf = dr[4]; // l.GeometryId = Convert.ToInt32(asdf); // // l.IntersectionGeometry = dr.GetString(5); // // // l.StartPoint = dr.GetDouble(7); // l.EndPoint = dr.GetDouble(8); // l.StreamLength = dr.GetDouble(9); yield return(l); } } finally { conn.Close(); } }