2017-09-11 2 views
0

J'ai une requête d'insertion comme ci-dessous. Cependant, scopeIdentity ne retourne pas 42, il retourne 1042.SCOPE_IDENTITY() renvoie le nombre mille

C'est la table SQL Server:

enter image description here

Mon code:

int masterId = 0; 

using (SqlConnection cmd = new SqlConnection(connString)) 
{ 
    using (SqlCommand conn = cmd.CreateCommand()) 
    { 
     conn.CommandText = "INSERT INTO[MasterReportData]([ReportName],[CaseList],[EmployeeId],[datetime]) VALUES(@reportName, @caseList, @employeeId, @datetime) SET @ID = SCOPE_IDENTITY()"; 

     conn.Parameters.Add("@reportName", SqlDbType.VarChar).Value = reportName; 
     conn.Parameters.Add("@caseList", SqlDbType.VarChar).Value = caseList; 
     conn.Parameters.Add("@employeeId", SqlDbType.Char).Value = employeeId; 
     conn.Parameters.Add("@datetime", SqlDbType.DateTime).Value = datetime; 
     conn.Parameters.Add("@ID", SqlDbType.Int).Direction = ParameterDirection.Output; 

     cmd.Open(); 
     conn.ExecuteNonQuery(); 

     masterId = Convert.ToInt32(conn.Parameters["@ID"].Value); 
     cmd.Close(); 
    } 
} 
+0

points-virgules manquants; ? pourquoi pensez-vous qu'il devrait revenir 42? même si la dernière rangée était '41', des insertions ou des suppressions annulées auraient pu faire avancer le compteur –

+4

Donc, si vous regardez dans la base de données, quelle valeur a été réellement insérée? Les sauts de 1000 dans les colonnes d'identité sont assez communs (depuis 2012, IIRC) et, de toute façon, si vous vous souciez de la * valeur numérique réelle *, je dirais que vous utilisez l'erreur d'identité. –

+0

Vérifiez la valeur actuelle de votre colonne d'identité sur cette table avec: 'SELECT IDENT_CURRENT ('MasterReportData')' - que retourne-t-il? –

Répondre

0

Jetez un oeil à https://docs.microsoft.com/en-us/sql/t-sql/functions/scope-identity-transact-sql

La description dit: Renvoie la dernière identité valeur insérée dans une colonne d'identité dans la même portée. Une portée est un module: une procédure stockée, un déclencheur, une fonction ou un lot. Par conséquent, si deux instructions sont dans la même procédure stockée, fonction ou lot, elles sont dans la même portée.

En mots: it Renvoie le dernier identifiant et non le suivant. Par conséquent, vous ne pouvez pas utiliser la commande INSERT comme ça. Ce que vous pouvez faire est:

Configurez votre ID comme identifiant d'incrémentation automatique. Ensuite, exécutez la commande INSERT et exécutez SELECT SCOPE_IDENTITY() par la suite pour savoir quel ID a été utilisé.