我有一种非常奇怪的行为。当我在本地测试应用程序时,一切正常,使用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,
)
我正在撞击我能找到的每一面墙,但仍然没有任何想法可以解释这可能是什么原因。
任何人都有任何想法?
答案 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时会抛出异常,您将指定列