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())
};

其中 History 是一个实体,data 是一个字符串(实际上是 SQL Server 上的 xml 数据类型)

因此,我尝试使用 SQL Profiler 查看哪些 SQL 语句会引发该异常,这是引发异常的跟踪部分:

RPC:Starting exec sp_executesql N'insert [dbo].[History]([tableRef], [idTableRef], [date], [idResp...
SQL事务
异常错误:245,严重性:16,状态:1
将 nvarchar 值“KV Oberaarau136”转换为数据类型 int 时,用户错误消息转换失败。
SQL事务
SP:已完成插入 [dbo].[History]([tableRef], [idTableRef], [date], [idResponsible], [data]) v...
RPC:Completed 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 回答