Example #1
0
        public EntityRecord ReadRecord(IDataRecord dataRecord, EntitySession session)
        {
            // Some outer join queries may produce entities that are null; so we first try to read Primary key values - if they're all null, we return null.
            if (_primaryKeyColumns.Count > 0 && PrimaryKeyIsNull(dataRecord))
            {
                return(null);
            }
            var              entRec  = new EntityRecord(_tableInfo.Entity, EntityStatus.Loading);
            bool             isView  = _tableInfo.Entity.Kind == EntityKind.View;
            object           dbValue = null;
            OutColumnMapping colMap  = null;

            //for-i loop is more efficient than foreach
            for (int i = 0; i < _columns.Count; i++)
            {
                try {
                    colMap = _columns[i];
                    var dbCol  = colMap.DbColumn;
                    var isNull = dataRecord.IsDBNull(colMap.ReaderColumnIndex);
                    if (isNull)
                    {
                        // Views might have NULLs unexpectedly in columns like Count() or Sum() - LINQ expr has non-nullable type, but in fact
                        // the view column can return NULL
                        if (isView && !dbCol.Flags.IsSet(DbColumnFlags.Nullable))
                        {
                            dbValue = dbCol.Member.DefaultValue;
                        }
                        else
                        {
                            dbValue = DBNull.Value;
                        }
                    }
                    else
                    {
                        // not NULL
                        dbValue = dbCol.TypeInfo.ColumnReader(dataRecord, colMap.ReaderColumnIndex);
                        var conv = dbCol.Converter.ColumnToProperty;
                        if (dbValue != null && conv != null)
                        {
                            dbValue = conv(dbValue);
                        }
                        // quick fix: views sometimes have out columns changed from expected
                        if (isView && !ConvertHelper.UnderlyingTypesMatch(dbCol.Member.DataType, dbValue.GetType()))
                        {
                            dbValue = ConvertHelper.ChangeType(dbValue, dbCol.Member.DataType);
                        }
                    }
                    var member = dbCol.Member;
                    entRec.ValuesOriginal[member.ValueIndex] = dbValue;
                } catch (Exception ex) {
                    ex.AddValue("DataRecord", dataRecord);
                    ex.AddValue("ColumnName", colMap.DbColumn.ColumnName);
                    ex.AddValue("DbValue", dbValue);
                    throw;
                }
            }
            var sessionRec = session.Attach(entRec); //might return different, previously loaded record

            return(sessionRec);
        }
Example #2
0
        public EntityRecord ReadRecord(IDataRecord dataRecord, EntitySession session)
        {
            // Some outer join queries may produce entities that are null; so we first try to read Primary key values - if they're all null, we return null.
            if (_primaryKeyColumns.Count > 0 && PrimaryKeyIsNull(dataRecord))
            {
                return(null);
            }
            var              entRec  = new EntityRecord(_tableInfo.Entity, EntityStatus.Loading);
            object           dbValue = null;
            OutColumnMapping colMap  = null;

            //for-i loop is more efficient than foreach
            for (int i = 0; i < _columns.Count; i++)
            {
                try {
                    colMap  = _columns[i];
                    dbValue = dataRecord[colMap.ReaderColumnIndex];
                    //System.Diagnostics.Debug.WriteLine(colMap.DbColumn.ColumnName + " " + dbValue + "(" + dbValue.GetType() + ")");
                    var conv = colMap.DbColumn.TypeInfo.ColumnToPropertyConverter;
                    if (dbValue != null && conv != null)
                    {
                        dbValue = conv(dbValue);
                    }
                    entRec.SetValue(colMap.DbColumn.Member, dbValue);
                } catch (Exception ex) {
                    ex.AddValue("DataRecord", dataRecord);
                    ex.AddValue("ColumnName", colMap.DbColumn.ColumnName);
                    ex.AddValue("DbValue", dbValue);
                    throw;
                }
            }
            var sessionRec = session.Attach(entRec); //might return different, previously loaded record

            return(sessionRec);
        }
Example #3
0
 public OutColumnMapping AddColumn(DbColumnInfo column, int readerColumnIndex = -1)
 {
     if (readerColumnIndex == -1)
     readerColumnIndex = _columns.Count;
       var colMapping = new OutColumnMapping() { ReaderColumnIndex = readerColumnIndex, DbColumn = column };
       _columns.Add(colMapping);
       if (column.Flags.IsSet(DbColumnFlags.PrimaryKey))
     _primaryKeyColumns.Add(colMapping);
       return colMapping;
 }
Example #4
0
        public OutColumnMapping AddColumn(DbColumnInfo column, int readerColumnIndex = -1)
        {
            if (readerColumnIndex == -1)
            {
                readerColumnIndex = _columns.Count;
            }
            var colMapping = new OutColumnMapping()
            {
                ReaderColumnIndex = readerColumnIndex, DbColumn = column
            };

            _columns.Add(colMapping);
            if (column.Flags.IsSet(DbColumnFlags.PrimaryKey))
            {
                _primaryKeyColumns.Add(colMapping);
            }
            return(colMapping);
        }