仅限生产中的sqlbulkcopy异常

时间:2016-11-03 22:54:49

标签: c# sql-server sqlbulkcopy

我有一种非常奇怪的行为。当我在本地测试应用程序时,一切正常,使用IIS Express,最新版本的VisualStudio 2015 Update 3。

但是在Windows Server 2012上的IIS8上运行的实时应用程序,有时它不会。

有时我收到以下异常:

System.InvalidOperationException: The given value of type String from the data source cannot be converted to type nvarchar of the specified target column. ---> System.InvalidOperationException: String or binary data would be truncated.

我记录了应用程序处理的数据,如果在生产中使用完全相同的数据文件生成异常,并且我在本地计算机上运行它(连接到生产数据库),它运行良好。没有例外。

异常的真正原因不能是DB列的长度,因为我逐字段检查了数据。顺便说一句,如果它是字符串长度的问题,我也会在本地获得异常。

这是数据表定义:

  var dt = new DataTable();
  dt.Columns.Add("gid", typeof(int));
  dt.Columns.Add("season", typeof(string));
  dt.Columns.Add("brand", typeof(string));
  dt.Columns.Add("brandid", typeof(string));
  dt.Columns.Add("pattern", typeof(string));
  dt.Columns.Add("width", typeof(string));
  dt.Columns.Add("ratio", typeof(string));
  dt.Columns.Add("diameter", typeof(string));
  dt.Columns.Add("load", typeof(string));
  dt.Columns.Add("speed", typeof(string));
  dt.Columns.Add("isrunflat", typeof(bool));
  dt.Columns.Add("price", typeof(decimal));
  dt.Columns.Add("original_descr", typeof(string));
  dt.Columns.Add("source", typeof(string));
  dt.Columns.Add("createdon", typeof(DateTime));
  dt.Columns.Add("updatedon", typeof(DateTime));
  dt.Columns.Add("eulgas", typeof(string));
  dt.Columns.Add("eulrai", typeof(string));
  dt.Columns.Add("eulnc", typeof(string));
  dt.Columns.Add("euldb", typeof(string));

这是数据库表定义:

CREATE TABLE [dbo].[grabbed_zero](
    [gid] [bigint] NOT NULL,
    [season] [nvarchar](50) NOT NULL,
    [brand] [nvarchar](50) NOT NULL,
    [brandid] [nvarchar](50) NOT NULL,
    [pattern] [nvarchar](100) NOT NULL,
    [width] [nvarchar](10) NOT NULL,
    [ratio] [nvarchar](10) NOT NULL,
    [diameter] [nvarchar](10) NOT NULL,
    [load] [nvarchar](10) NOT NULL,
    [speed] [nvarchar](10) NOT NULL,
    [isrunflat] [int] NOT NULL,
    [price] [decimal](10, 2) NOT NULL,
    [original_descr] [nvarchar](100) NOT NULL,
    [source] [nvarchar](50) NOT NULL,
    [createdon] [datetime] NOT NULL,
    [updatedon] [datetime] NOT NULL,
    [EULGAS] [nvarchar](10) NOT NULL,
    [EULRAI] [nvarchar](10) NOT NULL,
    [EULNC] [nvarchar](10) NOT NULL,
    [EULDB] [nvarchar](10) NOT NULL,
)

我正在撞击我能找到的每一面墙,但仍然没有任何想法可以解释这可能是什么原因。

任何人都有任何想法?

2 个答案:

答案 0 :(得分:2)

我最后发现的问题是由json反序列化引起的,它在发布模式下的行为与调试模式不同。

批量复制的数据文件最初是json格式。

当我发现时,我刚刚为newtonsoft软件包(已经更新到最新版本)制作了一个nuget Update-Package -reinstall,它解决了这个问题。

与sqlbulkcopy无关。

答案 1 :(得分:0)

尝试使用以下代码添加字符串dataColumn:

DataColumn d = new DataColumn(fieldname, typeof(string));
d.MaxLength = 10; //Specify max length
dt.Columns.Add(d);

因此,在将数据插入dataTable时会抛出异常,您将指定列