オブジェクトを追加し、オブジェクト コンテキストから別のオブジェクトを削除するコードがあります。オブジェクト コンテキストの変更を保存すると、次の SQL 例外が発生します。
nvarchar 値 'KV Oberaargau136' をデータ型 int に変換できませんでした
もちろん、「KV Oberaargau136」は int 値に変換できません。問題は、その文字列がどのようにそこに到達したのかわかりません。文字列を取得できる唯一の場所は、次のコードからです。
History h = new History()
{
idTableRef = rpo.idOA,
tableRef = "RelPersonOrganism",
date = now,
idResponsible = entities.getUserOA().id,
data = "<delete><organism><name><![CDATA[%name%]]></name><id>%id%</id></organism></delete>"
.Replace("%name%", organism.defaultName)
.Replace("%id%", organism.idOA.ToString())
};
履歴はエンティティであり、データは文字列です (実際には SQL Server の xml データ型)
そのため、SQL プロファイラーを使用して、どの SQL ステートメントがその例外を引き起こす可能性があるかを確認しようとしました。これは、例外をスローするトレースの一部です。
RPC:開始 exec sp_executesql N'insert [dbo].[History]([tableRef]、[idTableRef]、[date]、[idResp... SQLトランザクション 例外エラー: 245、重大度: 16、状態: 1 ユーザー エラー メッセージ nvarchar 値 'KV Oberaarau136' をデータ型 int に変換するときに変換に失敗しました。 SQLトランザクション SP:Completed insert [dbo].[History]([tableRef], [idTableRef], [date], [idResponsible], [data]) v... RPC:完了した exec sp_executesql N'insert [dbo].[History]([tableRef], [idTableRef], [date], [idRespon...
ここで、完全な SQL ステートメント (上記のトレースで 3 回示されています) は次のとおりです。
EXEC sp_executesql
N'insert [dbo].[History]([tableRef], [idTableRef], [date], [idResponsible], [data])
values (@0, @1, @2, @3, @4)
select [id]
from [dbo].[History]
where @@ROWCOUNT > 0 and [id] = scope_identity()',
N'@0 nvarchar(255),@1 int,@2 datetime2(7),@3 int,@4 nvarchar(max) ',
@0=N'RelPersonOrganism',
@1=1255,
@2='2013-01-11 12:35:18.4984109',
@3=1,
@4=N'<delete><organism><name><![CDATA[KV Oberaargau]]></name><id>136</id></organism></delete>'
そのため、トレースを見て、この SQL ステートメントは問題があると結論付けましたが、私にはまったく間違っているようには見えませんでした。だから私はSQL Server Management Studioでそれを実行しようとしましたが、エラーなしで完全にうまくいきました...
では、何がそのエラーを引き起こしているのでしょうか?