2010-04-08 10 views
73

So habe ich eine Tabelle mit einer Identitätsspalte als Primärschlüssel, also ist es eine ganze Zahl. Also, warum gibt SCOPE_IDENTITY() immer einen Dezimalwert anstelle von einem Int meiner C# -Anwendung zurück? Das ist wirklich ärgerlich, da dezimale Werte implizit nicht in Ganzzahlen in C# konvertiert werden, was bedeutet, dass ich eine Menge Dinge neu schreiben muss und viele Hilfsmethoden habe, weil ich SQL Server und Postgres verwende, für die Postgres eine ganze Zahl zurückgibt äquivalente Funktion ..Warum gibt SCOPE_IDENTITY() eine Dezimalzahl anstelle einer Ganzzahl zurück?

Warum gibt SCOPE_IDENTITY() nicht nur eine Ganzzahl zurück? Gibt es Leute da draußen, die häufig Dezimal/Nicht-Identitätswerte für Primärschlüssel verwenden?

Antwort

84

In SQL Server, die IDENTITY Eigenschaft kann tinyint, smallint, int, bigint, decimal(p, 0) oder numeric(p, 0) Spalten zugeordnet werden. Daher muss die SCOPE_IDENTITY-Funktion einen Datentyp zurückgeben, der alle oben genannten Elemente umfassen kann.

Wie vorherige Antworten gesagt haben, werfen Sie es einfach auf den Server int, bevor Sie es zurückgeben, dann wird ADO.NET seinen Typ wie erwartet erkennen.

+1

Ich wusste nicht, dass Sie etwas anderes als Int und Bigint für einen Primärschlüssel haben könnten. – Earlz

+0

'SCOPE_IDENTITY' Funktion Rückgabewert ist *** Dezimal (38,0) *** – Kiquenet

27

Kannst du es nicht einfach umwandeln, bevor du es von deiner Abfrage oder deinem gespeicherten Prozess zurückbringst (SPs geben immer int zurück, aber vielleicht verwendest du einen Ausgabeparameter)?

Wie SELECT CAST(SCOPE_IDENTITY() AS INT) AS LAST_IDENTITY

Und warum tut es das? Wahrscheinlich um flexibler zu sein und größere Zahlen zu bewältigen.

+0

'SCOPE_IDENTITY' ist eine integrierte Funktion .. so, wenn dabei wie' ExecuteScalar ('insert ...; wählen scope_identity()) ; 'Es wird eine Dezimalzahl von dieser Funktion anstelle des erwarteten int zurückgegeben. – Earlz

+0

@Earlz, so ändern Sie die SQL zu ExecuteScalar ('einfügen ...; wählen Sie CAST (scope_identity() AS int)'); –

3

Scope identity Rückgabewert ist dezimal (38,0)

CAST es, verwenden Sie die OUTPUT-Klausel, oder zu einem Ausgabeparameter zuweisen, anstatt SELECT SCOPE_IDENTITY() an den Client

3

versuchen dies mit und Sie werden eine ganze Zahl zurück:

ExecuteScalar('insert...; select CONVERT(int,scope_identity())'); 
Verwandte Themen