【问题标题】:SQlBulkCopy The given value of type DateTime from the data source cannot be converted to type int of the specified target columnSQlBulkCopy 来自数据源的 DateTime 类型的给定值无法转换为指定目标列的 int 类型
【发布时间】:2012-08-12 03:53:13
【问题描述】:

我在尝试执行以下“城市”数据表的 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 列之一中。 但是,稍后进行快速的条件调试,并在即时窗口中进行检查,发现所有 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

我真的很难过。

【问题讨论】:

  • 再次检查 cityTable 中定义的列的顺序是否与数据库表本身的列顺序匹配。
  • 谢谢大卫安德烈斯!!!!!!!!!昨天花了一整天试图调试这个问题,我不知道你定义列的顺序实际上影响了这个!我想将您的解决方案标记为答案,但您似乎将其写为评论而不是答案...
  • 是不是有点傻?框架应该照顾到这一点。
  • @Francisco:很高兴看到这对你有用。当我第一次遇到它时,它让我感到惊讶,但我怀疑它会不会再次出现! =) 不用担心答案的分数,因为这是一个容易被忽视的怪癖。

标签: c# sql performance parsing


【解决方案1】:

来自大卫安德烈斯:

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

【讨论】:

  • 我已经解释了更多here。事实上,它不仅是顺序,而且目标列的索引也应该映射到源表的列。您可以使用 SqlBulkCopyColumnMapping 来做到这一点。
  • @David Andres 我对 DateTime 数据类型也有同样的问题,但令人惊讶的是,当我上传 excel 文件时,它第一次在此错误处停止,但下次当我上传相同的 excel 文件时,它得到了上传成功,没有任何错误。我不知道为什么会这样。请建议
【解决方案2】:

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

【讨论】:

  • 老兄,我就是这样 ;-)
【解决方案3】:

对我来说,实体框架模型类与实际表不匹配(忘记从 db 搭建表模型):

//------------------------------------------------------------------------------
// <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.
    }
}

表:

【讨论】:

    猜你喜欢
    • 2013-08-10
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多