0

オブジェクトを追加し、オブジェクト コンテキストから別のオブジェクトを削除するコードがあります。オブジェクト コンテキストの変更を保存すると、次の 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でそれを実行しようとしましたが、エラーなしで完全にうまくいきました...

では、何がそのエラーを引き起こしているのでしょうか?

4

1 に答える 1

1

あなたが投稿したクエリがそのエラーメッセージを直接引き起こす可能性があることもわかりません。

そのため、XML を解析するトリガーまたは計算列があり、それが原因である可能性があるかどうかを確認してください。

于 2013-01-11T18:24:01.817 に答える