2011-01-10 12 views
0

Weiter Subsonic3 Abfrage gibt mir eine Fehlermeldung:Subsonic3 SetExpression Problem

Db.Update<Tag>() 
    .SetExpression("Popularity") 
    .EqualTo("Popularity+1") 
    .Where<Tag>(x => x.TagId == tagId) 
    .Execute(); 

Fehler: Fehler: System.FormatException: Fehler beim Parameterwert aus einem String in ein Int32 zu konvertieren.

Die sql, die generiert wird, ist in Ordnung, aber die Sammlung von Parametern enthält zwei Parameter, die festgelegt werden müssen.

UPDATE [Tagging].[Tag] 
SET Popularity=Popularity+1 
WHERE [Tagging].[Tag].[TagId] = @0 

Einer der Parameter @up_Popularity auf 'Popularity + 1' gesetzt. Da dies der erste Parameter ist, der gesetzt wird, wird dieser String 'Popularity + 1' einer ganzen Zahl zugewiesen.

Ist das ein Fehler oder mache ich etwas falsch?

Antwort

1
Db.Update<Tag>() 
    .SetExpression("Popularity = Popularity + 1") 
    .Where<Tag>(x => x.TagId == tagId) 
    .Execute(); 

Das sollte funktionieren ... aber ich denke, es ist für den Großhandel Updates ist. Nicht sicher. Ihre beste Wette ist unsere CodingHorror:

new CodingHorror("UPDATE Tags SET Popularity = Popularity + 1 WHERE @1", 
    tagId).Execute(); 
+0

Rob, es scheint ein Fehler zu sein, der besagt "Kann das Symbol wo nicht auflösen". Anscheinend gibt SetExpression eine Setting-Instanz und keine Update-Instanz zurück. –

+0

Diese Frage http://stackoverflow.com/questions/2429381/atomically-increment-a-field-using-subsonic-3-activerecord behebt das gleiche Problem, aber die vorgeschlagene Lösung funktioniert auch nicht (dann bekomme ich den Fehler oben in meiner Frage). –

+0

Btw, Ich arbeite an dem neuesten Code (von GitHub). –

0

Ich wäre erstaunt, wenn das funktionieren sollte. Wenn ich eine Zeichenfolge als Teil der SQL (und nicht von SubSonic) ausgewertet werden muss, muss ich fast immer eine CodingHorror verwenden.

Sie sollten dies jedoch mithilfe einer separaten Abfrage durchführen können. Etwas wie:

Db.Update<Tag>() 
    .Set("Popularity") 
    .EqualTo(Tag.SingleOrDefault(t => t.TagId == tagId).Popularity + 1) 
    .Where<Tag>(x => x.TagId == tagId) 
    .Execute(); 
+0

Nun, so wird es wahrscheinlich funktionieren, aber Sie müssen zweimal in die Datenbank gehen. –

+0

Ich denke, meine Abfrage sollte definitiv funktionieren, aber weil Subsonic zwei SQL-Parameter erstellt, funktioniert es nicht. –