2012-08-12 10 views
5

estoy recibiendo el código de error anterior al intentar hacer una SqlBulkInsert de los siguientes "Cities" DataTable:SqlBulkCopy El valor dado de tipo DateTime de la fuente de datos no se puede convertir a tipo int de la columna de destino especificado

DataTable cityTable = new DataTable(City.TABLE_NAME); 
cityTable.Columns.Add("id", typeof(int)); 
cityTable.Columns.Add("name", typeof(string)); 
cityTable.Columns.Add("ascii_name", typeof(string)); 
cityTable.Columns.Add("alternate_names", typeof(string)); 
cityTable.Columns.Add("latitude", typeof(double)); 
cityTable.Columns.Add("longitude", typeof(double)); 
cityTable.Columns.Add("feature_class", typeof(char)); 
cityTable.Columns.Add("feature_code", typeof(string)); 
cityTable.Columns.Add("country_code", typeof(string)); 
cityTable.Columns.Add("country_code2", typeof(string)); 
cityTable.Columns.Add("population", typeof(long)); 
cityTable.Columns.Add("elevation", typeof(int)); 
cityTable.Columns.Add("modification_date", typeof(DateTime)); 
cityTable.Columns.Add("admin1code", typeof(string)); 
cityTable.Columns.Add("admin2code", typeof(string)); 
cityTable.Columns.Add("admin3code", typeof(string)); 
cityTable.Columns.Add("admin4code", typeof(string)); 
cityTable.Columns.Add("gtopo30", typeof(int)); 
cityTable.Columns.Add("timezone_name", typeof(string)); 
cityTable.Columns.Add("version", typeof(Binary)); 

el siguiente es el código que añade cada entidad a la DataTable:

object id = EvaluateNullity(parsedCity.Id); 
object name = EvaluateNullity(parsedCity.Name); 
object asciiName = EvaluateNullity(parsedCity.AsciiName); 
object alternateNames = EvaluateNullity(parsedCity.AlternateNames); 
object latitude = EvaluateNullity(parsedCity.Latitude); 
object longitude = EvaluateNullity(parsedCity.Longitude); 
object featureClass = EvaluateNullity(parsedCity.FeatureClass); 
object featureCode = EvaluateNullity(parsedCity.FeatureCode); 
object countryCode = EvaluateNullity(parsedCity.CountryCode); 
object countryCode2 = EvaluateNullity(parsedCity.CountryCode2); 
object population = EvaluateNullity(parsedCity.Population); 
object elevation = EvaluateNullity(parsedCity.Elevation); 
object modificationDate = EvaluateNullity(parsedCity.ModificationDate); 
object admin1Code = EvaluateNullity(parsedCity.Admin1Code); 
object admin2Code = EvaluateNullity(parsedCity.Admin2Code); 
object admin3Code = EvaluateNullity(parsedCity.Admin3Code); 
object admin4Code = EvaluateNullity(parsedCity.Admin4Code); 
object gtopo30 = EvaluateNullity(parsedCity.Gtopo30); 
object timeZoneName = EvaluateNullity(parsedCity.TimeZoneName); 
object version = EvaluateNullity(parsedCity.Version); 

cityRow["id"] = id; 
cityRow["name"] = name; 
cityRow["ascii_name"] = asciiName; 
cityRow["alternate_names"] = alternateNames; 
cityRow["latitude"] = latitude; 
cityRow["longitude"] = longitude; 
cityRow["feature_class"] = featureClass; 
cityRow["feature_code"] = featureCode; 
cityRow["country_code"] = countryCode; 
cityRow["country_code2"] = countryCode2; 
cityRow["population"] = population; 
cityRow["elevation"] = elevation; 
cityRow["modification_date"] = modificationDate; 
cityRow["admin1code"] = admin1Code; 
cityRow["admin2code"] = admin2Code; 
cityRow["admin3code"] = admin3Code; 
cityRow["admin4code"] = admin4Code; 
cityRow["gtopo30"] = gtopo30; 
cityRow["timezone_name"] = timeZoneName; 
cityRow["version"] = version; 

y el código para EvaluateNullity:

public object EvaluateNullity(object entity) 
    { 
     return entity ?? DBNull.Value; 
    } 

Lo que entiendo de este mensaje de error es que se está colocando un valor de DateTime en una de las columnas int anteriores. Sin embargo, una depuración condicional rápida más tarde y las comprobaciones en la ventana Inmediato revelan que ninguna de las columnas int alguna vez tienen tipos DateTime colocados en ellas. http://desmond.imageshack.us/Himg42/scaled.php?server=42&filename=mod1rm.jpg&res=landing http://desmond.imageshack.us/Himg37/scaled.php?server=37&filename=modyf.jpg&res=landing

Estoy realmente perplejo.

+9

Verifique que el orden de las columnas definidas en cityTable coincida con el orden de las columnas dentro de la tabla de la base de datos. –

+0

Gracias David Andres !!!!!!!! Pasé todo el día de ayer tratando de solucionar este problema, ¡NO tenía idea de que el orden en que definió las columnas realmente afectó esto! Quería marcar su solución como respuesta, pero parece que la escribió como un comentario en lugar de una respuesta ... –

+3

¿No es un poco tonto? El marco debería ocuparse de eso. – Filip

Respuesta

19

De David Andrés:

a comprobar que el orden de las columnas definidas en cityTable coincide con el orden de las columnas dentro de la tabla de base de datos en sí.

+1

He explicado esto un poco más [aquí] (http://stackoverflow.com/questions/16892702/the-given-value-of-type-string-from-the-data-source-cannot-be-converted- a-type/20542022 # 20542022). De hecho, no solo es el orden, sino que el índice de las columnas de destino debe asignarse a las columnas de la tabla de origen. Puede hacerlo con SqlBulkCopyColumnMapping. – Sabo

+0

@David Andres También tengo el mismo problema con el tipo de datos DateTime, pero sorprendentemente cuando cargo archivos Excel, la primera vez se detiene en este error, pero la próxima vez que cargue el mismo archivo Excel, se carga correctamente sin ningún error. No tengo idea de por qué está sucediendo esto. Por favor recomiende – RSB

4

Una causa no obvia de este error es que debe tener una propiedad que represente columnas de identidad, aunque puede dejarlas sin configurar.

Cuestiones relacionadas