SQlBulkCopy:数据源中给定的DateTime类型的值无法转换为指定目标列的int类型。

13

当我尝试对以下“城市”DataTable进行SqlBulkInsert时,我收到了上述错误代码:

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));

以下是将每个实体添加到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;

而EvaluateNullity的代码如下:

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

从这个错误信息中我理解到,一个DateTime值被放置在上述的一个int列中。然而,快速条件调试后,在Immediate Window中检查发现没有任何int列中放置了DateTime类型的值。 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 我真的很困惑。

15
请仔细检查cityTable中定义的列顺序是否与数据库表本身中的列顺序匹配。 - David Andres
谢谢David Andres!!!!!! 昨天整天都在尝试调试这个问题,我完全不知道你定义列的顺序实际上会影响到这个问题! 我想把你的解决方案标记为答案,但是看起来你把它写成了评论而不是答案... - Francisco Aguilera
4
那不太傻吗?框架应该负责这个。 - Filip
@Francisco:很高兴看到这对你有用。当我第一次遇到它时,这个问题让我感到惊讶,但我不认为它会再次发生!=)不用担心答案的分数,因为这是一个容易忽略的小问题。 - David Andres
3个回答

32

来自David Andres:

请仔细检查cityTable中定义的列的顺序是否与数据库表本身中的列的顺序相匹配。

该句话提醒我们在使用cityTable时要注意列的顺序是否正确,需要与数据库表本身中的列的顺序一致。

2
我在这里更详细地解释了一下:https://dev59.com/iXLYa4cB1Zd3GeqPcdpR#20542022。实际上,不仅是顺序,目标列的索引也应映射到源表的列。您可以使用SqlBulkCopyColumnMapping来完成。 - Chinthana
@David Andres 我也遇到了DateTime数据类型的相同问题,但令人惊讶的是,当我上传Excel文件时,第一次会停在这个错误上,但下一次上传相同的Excel文件时,它会成功上传而没有任何错误。我不知道为什么会这样,请建议。 - RSB

12

导致此错误的一个不明显的原因是,您必须拥有表示标识列的属性,即使您可以将它们保持未设置。


0
对我来说,这是实体框架模型类和实际表之间的不匹配(忘记从数据库中生成表模型):
//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated from a template.
//
//     Manual changes to this file may cause unexpected behavior in your application.
//     Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace Databases
{
    using System;
    using System.Collections.Generic;
    
    public partial class FooTable
    {
        public int Id { get; set; }
        public string Name { get; set; }
        // --> Missing the LastUpdated Column.
    }
}

表格如下: 在这里输入图像描述

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接