diff --git a/src/System.Data.Jet/JetConfiguration.cs b/src/System.Data.Jet/JetConfiguration.cs index da7dfe9..a89e582 100644 --- a/src/System.Data.Jet/JetConfiguration.cs +++ b/src/System.Data.Jet/JetConfiguration.cs @@ -82,5 +82,14 @@ /// true to use the connection pooling; otherwise, false. /// public static bool UseConnectionPooling { get; set; } = false; + + /// + /// Gets or sets a value indicating whether to return a default value for the column + /// if the column is not meant to be null and somehow the value stored is actually null + /// + /// + /// true to return a default value; otherwise, false. + /// + public static bool UseDefaultValueOnDBNullConversionError { get; set; } = false; } } \ No newline at end of file diff --git a/src/System.Data.Jet/JetDataReader.cs b/src/System.Data.Jet/JetDataReader.cs index dc81ea6..3ca4d9b 100644 --- a/src/System.Data.Jet/JetDataReader.cs +++ b/src/System.Data.Jet/JetDataReader.cs @@ -47,6 +47,10 @@ namespace System.Data.Jet public override bool GetBoolean(int ordinal) { var value = _wrappedDataReader.GetValue(ordinal); + if (JetConfiguration.UseDefaultValueOnDBNullConversionError) + { + if (value is DBNull) return false; + } if (value is bool boolValue) return boolValue; @@ -75,6 +79,10 @@ namespace System.Data.Jet public override byte GetByte(int ordinal) { var value = GetValue(ordinal); + if (JetConfiguration.UseDefaultValueOnDBNullConversionError) + { + if (value is DBNull) return 0; + } if (value is byte byteValue) return byteValue; @@ -98,19 +106,47 @@ namespace System.Data.Jet } public override long GetBytes(int ordinal, long dataOffset, byte[] buffer, int bufferOffset, int length) - => _wrappedDataReader.GetBytes(ordinal, dataOffset, buffer, bufferOffset, length); + { + var value = _wrappedDataReader.GetValue(ordinal); + if (JetConfiguration.UseDefaultValueOnDBNullConversionError && value is DBNull) + { + return 0; + } + return _wrappedDataReader.GetBytes(ordinal, dataOffset, buffer, bufferOffset, length); + } public override char GetChar(int ordinal) - => _wrappedDataReader.GetChar(ordinal); + { + var value = _wrappedDataReader.GetValue(ordinal); + if (JetConfiguration.UseDefaultValueOnDBNullConversionError && value is DBNull) + { + return (char)0; + } + return (char) value; + } public override long GetChars(int ordinal, long dataOffset, char[] buffer, int bufferOffset, int length) - => _wrappedDataReader.GetChars(ordinal, dataOffset, buffer, bufferOffset, length); + { + var value = _wrappedDataReader.GetValue(ordinal); + if (JetConfiguration.UseDefaultValueOnDBNullConversionError && value is DBNull) + { + return 0; + } + return _wrappedDataReader.GetChars(ordinal, dataOffset, buffer, bufferOffset, length); + } public override string GetDataTypeName(int ordinal) => _wrappedDataReader.GetDataTypeName(ordinal); public override DateTime GetDateTime(int ordinal) - => _wrappedDataReader.GetDateTime(ordinal); + { + var value = _wrappedDataReader.GetValue(ordinal); + if (JetConfiguration.UseDefaultValueOnDBNullConversionError && value is DBNull) + { + return new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified); + } + return _wrappedDataReader.GetDateTime(ordinal); + } public virtual TimeSpan GetTimeSpan(int ordinal) => GetDateTime(ordinal) - JetConfiguration.TimeSpanOffset; @@ -119,10 +155,24 @@ namespace System.Data.Jet => GetDateTime(ordinal); public override decimal GetDecimal(int ordinal) - => Convert.ToDecimal(_wrappedDataReader.GetValue(ordinal)); + { + var value = _wrappedDataReader.GetValue(ordinal); + if (JetConfiguration.UseDefaultValueOnDBNullConversionError && value is DBNull) + { + return 0; + } + return Convert.ToDecimal(value); + } public override double GetDouble(int ordinal) - => Convert.ToDouble(_wrappedDataReader.GetValue(ordinal)); + { + var value = _wrappedDataReader.GetValue(ordinal); + if (JetConfiguration.UseDefaultValueOnDBNullConversionError && value is DBNull) + { + return 0; + } + return Convert.ToDouble(value); + } public override System.Collections.IEnumerator GetEnumerator() => _wrappedDataReader.GetEnumerator(); @@ -131,12 +181,23 @@ namespace System.Data.Jet => _wrappedDataReader.GetFieldType(ordinal); public override float GetFloat(int ordinal) - => Convert.ToSingle(_wrappedDataReader.GetValue(ordinal)); + { + var value = _wrappedDataReader.GetValue(ordinal); + if (JetConfiguration.UseDefaultValueOnDBNullConversionError && value is DBNull) + { + return 0; + } + return Convert.ToSingle(value); + } public override Guid GetGuid(int ordinal) { // Fix for discussion https://jetentityframeworkprovider.codeplex.com/discussions/647028 var value = _wrappedDataReader.GetValue(ordinal); + if (JetConfiguration.UseDefaultValueOnDBNullConversionError && value is DBNull) + { + return Guid.Empty; + } if (value is byte[]) return new Guid((byte[]) value); else @@ -144,15 +205,26 @@ namespace System.Data.Jet } public override short GetInt16(int ordinal) - => Convert.ToInt16(_wrappedDataReader.GetValue(ordinal)); + { + var value = _wrappedDataReader.GetValue(ordinal); + if (JetConfiguration.UseDefaultValueOnDBNullConversionError && value is DBNull) + { + return 0; + } + return Convert.ToInt16(value); + } public override int GetInt32(int ordinal) { // Fix for discussion https://jetentityframeworkprovider.codeplex.com/discussions/647028 var value = _wrappedDataReader.GetValue(ordinal); - if (value is string) + if (JetConfiguration.UseDefaultValueOnDBNullConversionError && value is DBNull) + { + return 0; + } + else if (value is string) { - var buffer = Encoding.Unicode.GetBytes((string) value); + var buffer = Encoding.Unicode.GetBytes((string)value); var intValue = BitConverter.ToInt32(buffer, 0); return intValue; } @@ -161,7 +233,14 @@ namespace System.Data.Jet } public override long GetInt64(int ordinal) - => Convert.ToInt64(_wrappedDataReader.GetValue(ordinal)); + { + var value = _wrappedDataReader.GetValue(ordinal); + if (JetConfiguration.UseDefaultValueOnDBNullConversionError && value is DBNull) + { + return 0; + } + return Convert.ToInt64(value); + } public override string GetName(int ordinal) => _wrappedDataReader.GetName(ordinal); @@ -173,7 +252,14 @@ namespace System.Data.Jet => _wrappedDataReader.GetSchemaTable(); public override string GetString(int ordinal) - => _wrappedDataReader.GetString(ordinal); + { + var value = _wrappedDataReader.GetValue(ordinal); + if (JetConfiguration.UseDefaultValueOnDBNullConversionError && value is DBNull) + { + return ""; + } + return _wrappedDataReader.GetString(ordinal); + } public override object GetValue(int ordinal) => _wrappedDataReader.GetValue(ordinal);