Puede que se de el caso de que encuentres algún fallo con tu código o proyecto, recuerda probar siempre en un ambiente de testing antes subir el código al proyecto final.
Solución:
Para las personas que se topan con esta pregunta y reciben un mensaje de error similar con respecto a un nvarchar en lugar de dinero:
El valor dado de tipo String del origen de datos no se puede convertir al tipo nvarchar de la columna de destino especificada.
Esto podría deberse a una columna demasiado corta.
Por ejemplo, si su columna se define como nvarchar(20)
y tienes un caracter 40 string, es posible que obtenga este error.
Fuente
Utilice SqlBulkCopyColumnMapping.
Ejemplo:
private void SaveFileToDatabase(string filePath)
string strConnection = System.Configuration.ConfigurationManager.ConnectionStrings["MHMRA_TexMedEvsConnectionString"].ConnectionString.ToString();
String excelConnString = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=0;Extended Properties="Excel 12.0"", filePath);
//Create Connection to Excel work book
using (OleDbConnection excelConnection = new OleDbConnection(excelConnString))
//Create OleDbCommand to fetch data from Excel
using (OleDbCommand cmd = new OleDbCommand("Select * from [Crosswalk$]", excelConnection))
excelConnection.Open();
using (OleDbDataReader dReader = cmd.ExecuteReader())
using (SqlBulkCopy sqlBulk = new SqlBulkCopy(strConnection))
//Give your Destination table name
sqlBulk.DestinationTableName = "PaySrcCrosswalk";
// this is a simpler alternative to explicit column mappings, if the column names are the same on both sides and data types match
foreach(DataColumn column in dt.Columns)
s.ColumnMappings.Add(new SqlBulkCopyColumnMapping(column.ColumnName, column.ColumnName));
sqlBulk.WriteToServer(dReader);
Como no creo "Please use..." plus some random code that is unrelated to the question
es una buena respuesta, pero creo que el espíritu era correcto, decidí responder esto correctamente.
Cuando usa Sql Bulk Copy, intenta alinear sus datos de entrada directamente con los datos en el servidor. Entonces, toma la tabla del servidor y realiza una declaración SQL similar a esta:
INSERT INTO [schema].[table] (col1, col2, col3) VALUES
Por lo tanto, si le asigna las Columnas 1, 3 y 2, AUNQUE sus nombres coincidan (p. ej.: col1, col3, col2). Se insertará así:
INSERT INTO [schema].[table] (col1, col2, col3) VALUES
('col1', 'col3', 'col2')
Sería un trabajo adicional y una sobrecarga para Sql Bulk Insert tener que determinar una asignación de columnas. Entonces, en cambio, le permite elegir … Asegúrese de que su Código y las columnas de su Tabla SQL estén en el mismo orden, o indique explícitamente que se alineen por Nombre de columna.
Por lo tanto, si su problema es la desalineación de las columnas, que es probablemente la causa principal de este error, esta respuesta es para usted.
TLDR
using System.Data;
//...
myDataTable.Columns.Cast().ToList().ForEach(x =>
bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping(x.ColumnName, x.ColumnName)));
Esto tomará su DataTable existente, que intenta insertar en su objeto BulkCopy creado, y solo asignará explícitamente un nombre a otro. Por supuesto, si, por alguna razón, decidiste nombrar tus columnas de DataTable de manera diferente a las columnas de SQL Server… eso depende de ti.
Agradecemos que quieras patrocinar nuestra publicación ejecutando un comentario o dejando una valoración te damos la bienvenida.