2016-11-03 10 views
3

非常に奇妙な動作をしています。私はローカルでアプリケーションをテストすると、すべてがIIS Expressの、VisualStudioを2015年の最新のリリースで、正常に動作します更新3.生産時のsqlbulkcopy例外

しかしの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に接続された)、それは素晴らしい作品です。例外なし。私はフィールドで、フィールドをデータをチェックしているため

例外の本当の理由は、DBの列の長さにすることはできません。そして、それは文字列の長さの問題だった場合は、私は例外をローカルにも取得します。

これはDataTableの定義です:

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

これが原因かもしれないことについて

誰もが任意のアイデアを持って?

+3

おそらくあなたは 'DataTable'であなたの文字列の列に追加している文字列のいずれかは、その列のためのテーブルで定義された長さの制約をオーバーフロー? –

+0

@KirkWollデバッグ中の文字列の長さを1つずつチェックしましたが、それらは制限内にあります。また、同じデータファイルを本番環境で使用し、開発マシンでローカルに使用すると、ローカルで動作します。同じDB、同じコード、同じデータを使用する。サーバー上のものである必要がありますが、私は何を推測しています。 –

+1

「アプリケーションをリリースモードでローカルに起動します。例外があります。」というエラーが表示されるまで、リリースモードで列を削除します。バグを見つけ出すためには、未知の列よりも特定の列を1つまたは複数指定する方が簡単です。あなたが後で行うことができることの1つは、インサートでそれぞれを実行することです。どの値から問題が発生しているか正確に知ることができます。それは、この奇妙な問題をデバッグするのに役立ちます。 –

答えて

0

次のコードを使用して文字列のDataColumnを追加してみてください:

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

だから、のdataTableにデータを挿入するときに例外がスローされますと、あなたは、私が最後に見つけた何列

+0

コードを列定義に使用するように変更しましたが、それでも例外がスローされます。私が平均で見つけたのは、ローカルでリリースモードでアプリケーションを起動すると、デバッグモードでは例外があります。プロダクションで同じことがデバッグモードで公開されていて、動作します。しかし、なぜ私は理解していない。 –

2

を指定しますされますデバッグモードとは異なるリリースモードで動作していたjsonデシリアライズによって問題が発生しました。

データファイルがコピーされたバルクであることは、JSON形式で最初にありました。

私が知りましたところ、newtonsoftパッケージ(最新のリリースに既に更新されている)用のUpdate-Package -reinstallを作成しました。これで問題は解決しました。

はsqlbulkcopyに無関係ました。

関連する問題