下一个SubSonic3查询给出了一个错误:
Db.Update<Tag>()
.SetExpression("Popularity")
.EqualTo("Popularity+1")
.Where<Tag>(x => x.TagId == tagId)
.Execute();
错误:失败:System.FormatException:无法将参数值从String转换为Int32。
生成的sql是正常的,但参数集合包含两个需要设置的参数。
UPDATE [Tagging].[Tag]
SET Popularity=Popularity+1
WHERE [Tagging].[Tag].[TagId] = @0
其中一个参数将@up_Popularity设置为'Popularity + 1'。由于这是第一个设置的参数,因此sql triese将此字符串'Popularity + 1'分配给整数。
这是一个错误还是我做错了什么?
答案 0 :(得分:1)
Db.Update<Tag>()
.SetExpression("Popularity = Popularity + 1")
.Where<Tag>(x => x.TagId == tagId)
.Execute();
这应该有效...但我认为这是批发更新。不确定。你最好的选择是使用我们的CodingHorror:
new CodingHorror("UPDATE Tags SET Popularity = Popularity + 1 WHERE @1",
tagId).Execute();
答案 1 :(得分:0)
如果这应该有效,我会感到惊讶。当我需要将一个字符串作为SQL的一部分(而不是SubSonic)进行评估时,我几乎总是不得不使用CodingHorror。
但是,您应该可以使用单独的查询来执行此操作。类似的东西:
Db.Update<Tag>()
.Set("Popularity")
.EqualTo(Tag.SingleOrDefault(t => t.TagId == tagId).Popularity + 1)
.Where<Tag>(x => x.TagId == tagId)
.Execute();