/// <summary> /// Check that every column specified in the mappings collection exists /// in the wrapped reader. /// </summary> void ValidateBulkCopySourceColumnMappings(SqlBulkCopyColumnMappingCollection mappings) { foreach (SqlBulkCopyColumnMapping mapping in mappings) { var sc = new SqlName(mapping.SourceColumn); if (!String.IsNullOrEmpty(sc.Name)) { if (wrappedReader.GetOrdinal(sc.Name) == -1) { string bestFit = wrappedReader.GetColumns().SingleOrDefault(c => c.Equals(sc.Name, StringComparison.OrdinalIgnoreCase)); if (bestFit == null) { throw new SchemaException("Source column " + mapping.SourceColumn + " does not exist in source."); } else { throw new SchemaException ( "Source column " + mapping.SourceColumn + " does not exist in source." + " Column name mappings are case specific and best found match is " + bestFit + "." ); } } } else { if (mapping.SourceOrdinal < 0 || mapping.SourceOrdinal >= wrappedReader.FieldCount) { throw new SchemaException("No column exists at index " + mapping.SourceOrdinal + " in source."); } } } }
void ValidateBulkCopyDestinationColumnMappings ( SqlBulkCopyColumnMappingCollection mappings, Dictionary <string, int> columnLookup, DataRow[] columns ) { foreach (SqlBulkCopyColumnMapping mapping in mappings) { var destColumn = new SqlName(mapping.DestinationColumn); if (!String.IsNullOrEmpty(destColumn.Name)) { if (!columnLookup.ContainsKey(destColumn.Name)) { // If we can't find an exact match by case, try for a case-insensitive match. string bestFit = columnLookup.Keys.SingleOrDefault(c => c.Equals(destColumn.Name, StringComparison.OrdinalIgnoreCase)); if (bestFit == null) { throw new SchemaException ( "Destination column " + mapping.DestinationColumn + " does not exist in destination table " + targetTableName + " in database " + targetDatabaseName + " on server " + targetServerName + "." ); } else { throw new SchemaException ( "Destination column " + mapping.DestinationColumn + " does not exist in destination table " + targetTableName + " in database " + targetDatabaseName + " on server " + targetServerName + ". Column name mappings are case specific and best found match is " + bestFit + "." ); } } } else { if (mapping.DestinationOrdinal < 0 || mapping.DestinationOrdinal >= columns.Length) { throw new SchemaException ( "No column exists at index " + mapping.DestinationOrdinal + " in destination table " + targetTableName + " in database " + targetDatabaseName + " on server " + targetServerName + "." ); } } } }
void CreateLookupFromColumnMappings ( SqlBulkCopyColumnMappingCollection mappings, DataTable schemaTableOfDestinationTable ) { // create lookup dest column definition by source index foreach (SqlBulkCopyColumnMapping mapping in mappings) { int sourceIndex = -1; var sourceColumn = new SqlName(mapping.SourceColumn); if (!String.IsNullOrEmpty(sourceColumn.Name)) { sourceIndex = wrappedReader.GetOrdinal(sourceColumn.Name); } else { sourceIndex = mapping.SourceOrdinal; } DataRow destColumnDef = null; var destColumn = new SqlName(mapping.DestinationColumn); if (!String.IsNullOrEmpty(destColumn.Name)) { destColumnDef = schemaTableOfDestinationTable.Rows.Cast <DataRow>(). Single(c => (string)c["ColumnName"] == destColumn.Name); //foreach (DataRow column in schemaTableOfDestinationTable.Rows) //{ // if ((string)column["ColumnName"] == destColumn.Name) // { // destColumnDef = column; // break; // } //} } else { destColumnDef = schemaTableOfDestinationTable.Rows.Cast <DataRow>(). Single(c => (int)c["ColumnOrdinal"] == mapping.DestinationOrdinal); //foreach (DataRow column in schemaTableOfDestinationTable.Rows) //{ // if ((int)column["ColumnOrdinal"] == mapping.DestinationOrdinal) // { // destColumnDef = column; // break; // } //} } lookup[sourceIndex] = destColumnDef; } }