Skip to content

Commit

Permalink
Improved sqlBulkCopy data conversion's error message
Browse files Browse the repository at this point in the history
support RowID for DataTable and DataRow[]
  • Loading branch information
Davoud Eshtehari authored and Davoud Eshtehari committed Feb 21, 2020
1 parent 4e9b048 commit 339c7e6
Show file tree
Hide file tree
Showing 13 changed files with 242 additions and 145 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,31 @@ public SourceColumnMetadata(ValueMethod method, bool isSqlType, bool isDataFeed)
private DataRowState _rowStateToSkip;
private IEnumerator _rowEnumerator;

private int RowNumber
{
get
{
int rowNo;

switch (_rowSourceType)
{
case ValueSourceType.RowArray:
rowNo = ((DataTable)_dataTableSource).Rows.IndexOf(_rowEnumerator.Current as DataRow);
break;
case ValueSourceType.DataTable:
rowNo = ((DataTable)_rowSource).Rows.IndexOf(_rowEnumerator.Current as DataRow);
break;

case ValueSourceType.DbDataReader:
case ValueSourceType.IDataReader:
case ValueSourceType.Unspecified:
default:
return -1;
}
return ++rowNo;
}
}

private TdsParser _parser;
private TdsParserStateObject _stateObj;
private List<_ColumnMapping> _sortedColumnMappings;
Expand Down Expand Up @@ -1477,7 +1502,7 @@ private object ConvertValue(object value, _SqlMetaData metadata, bool isNull, re
}
catch (SqlTruncateException)
{
throw SQL.BulkLoadCannotConvertValue(value.GetType(), mt, metadata.ordinal, metadata.isEncrypted, metadata.column, value.ToString(), ADP.ParameterValueOutOfRange(sqlValue));
throw SQL.BulkLoadCannotConvertValue(value.GetType(), mt, metadata.ordinal, RowNumber, metadata.isEncrypted, metadata.column, value.ToString(), ADP.ParameterValueOutOfRange(sqlValue));
}
}

Expand Down Expand Up @@ -1566,7 +1591,7 @@ private object ConvertValue(object value, _SqlMetaData metadata, bool isNull, re

default:
Debug.Fail("Unknown TdsType!" + type.NullableType.ToString("x2", (IFormatProvider)null));
throw SQL.BulkLoadCannotConvertValue(value.GetType(), metadata.metaType, metadata.ordinal, metadata.isEncrypted, metadata.column, value.ToString(), null);
throw SQL.BulkLoadCannotConvertValue(value.GetType(), metadata.metaType, metadata.ordinal, RowNumber, metadata.isEncrypted, metadata.column, value.ToString(), null);
}

if (typeChanged)
Expand All @@ -1583,7 +1608,7 @@ private object ConvertValue(object value, _SqlMetaData metadata, bool isNull, re
{
throw;
}
throw SQL.BulkLoadCannotConvertValue(value.GetType(), metadata.metaType, metadata.ordinal, metadata.isEncrypted, metadata.column, value.ToString(), e);
throw SQL.BulkLoadCannotConvertValue(value.GetType(), metadata.metaType, metadata.ordinal, RowNumber, metadata.isEncrypted, metadata.column, value.ToString(), e);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -812,14 +812,14 @@ internal static Exception BulkLoadMappingsNamesOrOrdinalsOnly()
{
return ADP.InvalidOperation(System.SRHelper.GetString(SR.SQL_BulkLoadMappingsNamesOrOrdinalsOnly));
}
internal static Exception BulkLoadCannotConvertValue(Type sourcetype, MetaType metatype, int ordinal, bool isEncrypted, string columnName, string value, Exception e)
internal static Exception BulkLoadCannotConvertValue(Type sourcetype, MetaType metatype, int ordinal, int rowNumber, bool isEncrypted, string columnName, string value, Exception e)
{
string quotedValue = "given value";
string quotedValue = string.Empty;

if (!isEncrypted)
quotedValue = string.Format("'{0}'", (value.Length > 100 ? value.Substring(0, 100) : value));
quotedValue = string.Format(" '{0}'", (value.Length > 100 ? value.Substring(0, 100) : value));

return ADP.InvalidOperation(System.SRHelper.GetString(SR.SQL_BulkLoadCannotConvertValue, quotedValue, sourcetype.Name, metatype.TypeName, ordinal, columnName), e);
return ADP.InvalidOperation(System.SRHelper.GetString(SR.SQL_BulkLoadCannotConvertValue, quotedValue, sourcetype.Name, metatype.TypeName, ordinal, columnName, rowNumber), e);
}
internal static Exception BulkLoadNonMatchingColumnMapping()
{
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion src/Microsoft.Data.SqlClient/netcore/src/Resources/SR.resx
Original file line number Diff line number Diff line change
Expand Up @@ -625,7 +625,7 @@
<value>Mappings must be either all name or all ordinal based.</value>
</data>
<data name="SQL_BulkLoadCannotConvertValue" xml:space="preserve">
<value>The {0} of type {1} from the data source cannot be converted to type {2} for colid {3} [{4}].</value>
<value>The given value{0} of type {1} from the data source cannot be converted to type {2} for Column {3} [{4}] Row {5}.</value>
</data>
<data name="SQL_BulkLoadNonMatchingColumnMapping" xml:space="preserve">
<value>The given ColumnMapping does not match up with any column in the source or destination.</value>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -313,10 +313,10 @@
</ItemGroup>
<!-- Resources -->
<ItemGroup>
<Compile Include="Resources\$(ResxFileName).Designer.cs">
<Compile Include="Resources\Strings.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>$(ResxFileName).resx</DependentUpon>
<DependentUpon>Strings.resx</DependentUpon>
</Compile>
<Compile Include="Resources\$(ResxFileName)Helper.cs" />
<EmbeddedResource Include="Resources\$(ResxFileName).resx">
Expand Down Expand Up @@ -372,4 +372,4 @@
<Import Project="$(NetFxSource)tools\targets\GenerateThisAssemblyCs.targets" />
<Import Project="$(NetFxSource)tools\targets\GenerateAssemblyRef.targets" />
<Import Project="$(NetFxSource)tools\targets\GenerateAssemblyInfo.targets" />
</Project>
</Project>
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,31 @@ public SourceColumnMetadata(ValueMethod method, bool isSqlType, bool isDataFeed)
private DataRowState _rowStateToSkip;
private IEnumerator _rowEnumerator;

private int RowNumber
{
get
{
int rowNo;

switch (_rowSourceType)
{
case ValueSourceType.RowArray:
rowNo = ((DataTable)_dataTableSource).Rows.IndexOf(_rowEnumerator.Current as DataRow);
break;
case ValueSourceType.DataTable:
rowNo = ((DataTable)_rowSource).Rows.IndexOf(_rowEnumerator.Current as DataRow);
break;

case ValueSourceType.DbDataReader:
case ValueSourceType.IDataReader:
case ValueSourceType.Unspecified:
default:
return -1;
}
return ++rowNo;
}
}

private TdsParser _parser;
private TdsParserStateObject _stateObj;
private List<_ColumnMapping> _sortedColumnMappings;
Expand Down Expand Up @@ -1629,11 +1654,11 @@ private object ConvertValue(object value, _SqlMetaData metadata, bool isNull, re
}
catch (SqlTruncateException)
{
throw SQL.BulkLoadCannotConvertValue(value.GetType(), mt, metadata.ordinal, metadata.isEncrypted, metadata.column, value.ToString(), ADP.ParameterValueOutOfRange(sqlValue));
throw SQL.BulkLoadCannotConvertValue(value.GetType(), mt, metadata.ordinal, RowNumber, metadata.isEncrypted, metadata.column, value.ToString(), ADP.ParameterValueOutOfRange(sqlValue));
}
catch (Exception e)
{
throw SQL.BulkLoadCannotConvertValue(value.GetType(), mt, metadata.ordinal, metadata.isEncrypted, metadata.column, value.ToString(), e);
throw SQL.BulkLoadCannotConvertValue(value.GetType(), mt, metadata.ordinal, RowNumber, metadata.isEncrypted, metadata.column, value.ToString(), e);
}
}

Expand Down Expand Up @@ -1722,7 +1747,7 @@ private object ConvertValue(object value, _SqlMetaData metadata, bool isNull, re

default:
Debug.Assert(false, "Unknown TdsType!" + type.NullableType.ToString("x2", (IFormatProvider)null));
throw SQL.BulkLoadCannotConvertValue(value.GetType(), type, metadata.ordinal, metadata.isEncrypted, metadata.column, value.ToString(), null);
throw SQL.BulkLoadCannotConvertValue(value.GetType(), type, metadata.ordinal, RowNumber, metadata.isEncrypted, metadata.column, value.ToString(), null);
}

if (typeChanged)
Expand All @@ -1739,7 +1764,7 @@ private object ConvertValue(object value, _SqlMetaData metadata, bool isNull, re
{
throw;
}
throw SQL.BulkLoadCannotConvertValue(value.GetType(), type, metadata.ordinal, metadata.isEncrypted, metadata.column, value.ToString(), e);
throw SQL.BulkLoadCannotConvertValue(value.GetType(), type, metadata.ordinal, RowNumber, metadata.isEncrypted, metadata.column, value.ToString(), e);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -959,14 +959,14 @@ static internal Exception BulkLoadMappingsNamesOrOrdinalsOnly()
{
return ADP.InvalidOperation(StringsHelper.GetString(Strings.SQL_BulkLoadMappingsNamesOrOrdinalsOnly));
}
static internal Exception BulkLoadCannotConvertValue(Type sourcetype, MetaType metatype, int ordinal, bool isEncrypted, string columnName, string value, Exception e)
static internal Exception BulkLoadCannotConvertValue(Type sourcetype, MetaType metatype, int ordinal, int rowNumber, bool isEncrypted, string columnName, string value, Exception e)
{
string quotedValue = "given value";
string quotedValue = string.Empty;

if (!isEncrypted)
quotedValue = string.Format("'{0}'", (value.Length > 100 ? value.Substring(0, 100) : value));
quotedValue = string.Format(" '{0}'", (value.Length > 100 ? value.Substring(0, 100) : value));

return ADP.InvalidOperation(StringsHelper.GetString(Strings.SQL_BulkLoadCannotConvertValue, quotedValue, sourcetype.Name, metatype.TypeName, ordinal, columnName), e);
return ADP.InvalidOperation(StringsHelper.GetString(Strings.SQL_BulkLoadCannotConvertValue, quotedValue, sourcetype.Name, metatype.TypeName, ordinal, columnName, rowNumber), e);
}
static internal Exception BulkLoadNonMatchingColumnMapping()
{
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -2809,7 +2809,7 @@
<value>Mappings must be either all name or all ordinal based.</value>
</data>
<data name="SQL_BulkLoadCannotConvertValue" xml:space="preserve">
<value>The {0} of type {1} from the data source cannot be converted to type {2} for colid {3} [{4}].</value>
<value>The given value{0} of type {1} from the data source cannot be converted to type {2} for Column {3} [{4}] Row {5}.</value>
</data>
<data name="SQL_BulkLoadNonMatchingColumnMapping" xml:space="preserve">
<value>The given ColumnMapping does not match up with any column in the source or destination.</value>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@
<Compile Include="ProviderAgnostic\MultipleResultsTest\MultipleResultsTest.cs" />
<Compile Include="ProviderAgnostic\ReaderTest\ReaderTest.cs" />
<Compile Include="SQL\AsyncTest\AsyncTest.cs" />
<Compile Include="SQL\SqlBulkCopyTest\DataConversionErrorMessage.cs" />
<Compile Include="SQL\SqlBulkCopyTest\DataConversionErrorMessageTest.cs" />
<Compile Include="SQL\SqlCommand\SqlCommandCompletedTest.cs" />
<Compile Include="SQL\SqlCommand\SqlCommandCancelTest.cs" />
<Compile Include="SQL\ConnectionPoolTest\ConnectionPoolTest.cs" />
Expand Down

This file was deleted.

Loading

0 comments on commit 339c7e6

Please sign in to comment.