Exemple #1
0
        public static void PopulateObjectWithSqlReader <T>(this IOrmLiteDialectProvider dialectProvider,
                                                           object objWithProperties, IDataReader reader,
                                                           Tuple <FieldDefinition, int, IOrmLiteConverter>[] indexCache, object[] values)
        {
            values = PopulateValues(reader, values, dialectProvider);

            var dbNullFilter = OrmLiteConfig.OnDbNullFilter;

            foreach (var fieldCache in indexCache)
            {
                try
                {
                    var fieldDef  = fieldCache.Item1;
                    var index     = fieldCache.Item2;
                    var converter = fieldCache.Item3;

                    if (values != null && values[index] == DBNull.Value)
                    {
                        var value    = fieldDef.IsNullable ? null : fieldDef.FieldTypeDefaultValue;
                        var useValue = dbNullFilter?.Invoke(fieldDef);
                        if (useValue != null)
                        {
                            value = useValue;
                        }

                        fieldDef.SetValue(objWithProperties, value);
                    }
                    else
                    {
                        var value = converter.GetValue(reader, index, values);
                        if (value == null)
                        {
                            if (!fieldDef.IsNullable)
                            {
                                value = fieldDef.FieldTypeDefaultValue;
                            }
                            var useValue = dbNullFilter?.Invoke(fieldDef);
                            if (useValue != null)
                            {
                                value = useValue;
                            }
                            fieldDef.SetValue(objWithProperties, value);
                        }
                        else
                        {
                            var fieldValue = converter.FromDbValue(fieldDef.FieldType, value);
                            fieldDef.SetValue(objWithProperties, fieldValue);
                        }
                    }
                }
                catch (Exception ex)
                {
                    OrmLiteUtils.HandleException(ex);
                }
            }

            OrmLiteConfig.PopulatedObjectFilter?.Invoke(objWithProperties);
        }
        public static T PopulateWithSqlReader <T>(this T objWithProperties,
                                                  IOrmLiteDialectProvider dialectProvider, IDataReader reader,
                                                  Tuple <FieldDefinition, int, IOrmLiteConverter>[] indexCache, object[] values)
        {
            try
            {
                if (!OrmLiteConfig.DeoptimizeReader)
                {
                    if (values == null)
                    {
                        values = new object[reader.FieldCount];
                    }

                    try
                    {
                        dialectProvider.GetValues(reader, values);
                    }
                    catch (Exception ex)
                    {
                        values = null;
                        Log.Warn("Error trying to use GetValues() from DataReader. Falling back to individual field reads...", ex);
                    }
                }
                else
                {
                    //Calling GetValues() on System.Data.SQLite.Core ADO.NET Provider changes behavior of reader.GetGuid()
                    //So allow providers to by-pass reader.GetValues() optimization.
                    values = null;
                }

                foreach (var fieldCache in indexCache)
                {
                    var fieldDef  = fieldCache.Item1;
                    var index     = fieldCache.Item2;
                    var converter = fieldCache.Item3;

                    if (values != null && values[index] == DBNull.Value)
                    {
                        var value = fieldDef.IsNullable ? null : fieldDef.FieldTypeDefaultValue;
                        if (OrmLiteConfig.OnDbNullFilter != null)
                        {
                            var useValue = OrmLiteConfig.OnDbNullFilter(fieldDef);
                            if (useValue != null)
                            {
                                value = useValue;
                            }
                        }

                        fieldDef.SetValueFn(objWithProperties, value);
                    }
                    else
                    {
                        var value = converter.GetValue(reader, index, values);
                        if (value == null)
                        {
                            if (!fieldDef.IsNullable)
                            {
                                value = fieldDef.FieldTypeDefaultValue;
                            }
                            if (OrmLiteConfig.OnDbNullFilter != null)
                            {
                                var useValue = OrmLiteConfig.OnDbNullFilter(fieldDef);
                                if (useValue != null)
                                {
                                    value = useValue;
                                }
                            }
                            fieldDef.SetValueFn(objWithProperties, value);
                        }
                        else
                        {
                            var fieldValue = converter.FromDbValue(fieldDef.FieldType, value);
                            fieldDef.SetValueFn(objWithProperties, fieldValue);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                OrmLiteUtils.HandleException(ex);
            }
            return(objWithProperties);
        }