Je crée une application Winform en C # et utilise une base de données SQL.
J'ai une table, employee_master
, qui a des colonnes comme Id, name, address
et phone no
. Id
est une incrémentation automatique et tous les autres types de données sont varchar
.
J'utilise ce code pour obtenir la prochaine valeur d'incrémentation automatique:
string s = "select max(id) as Id from Employee_Master";
SqlCommand cmd = new SqlCommand(s, obj.con);
SqlDataReader dr = cmd.ExecuteReader();
dr.Read();
int i = Convert.ToInt16(dr["Id"].ToString());
txtId.Text = (i + 1).ToString();
Je montre sur un textBox.
Mais quand la dernière ligne de la table est supprimée, j'obtiens toujours cette valeur qui a été récemment supprimée dans la zone de texte
Comment dois-je obtenir la prochaine valeur d'auto-incrémentation?
Pour obtenir la prochaine valeur d'auto-incrémentation à partir de SQLServer:
Cela va chercher la valeur actuelle d'auto-incrémentation.
SELECT IDENT_CURRENT('table_name');
Prochaine valeur d'incrémentation automatique.
SELECT IDENT_CURRENT('table_name')+1;
------> Cela fonctionnera même si vous ajoutez une ligne, puis la supprimez, car IDENT_CURRENT renvoie la dernière valeur d'identité générée pour une table spécifique dans une session et une étendue quelconque.
essaye ça:
SELECT IDENT_CURRENT('tbl_name') + IDENT_INCR('tbl_name');
Lorsque vous supprimez une ligne de la table, le nombre suivant restera le même, car il ne diminuera en aucune façon.
Donc, si vous avez 100 lignes et que vous supprimez la ligne 100. Vous auriez 99 lignes, mais le nombre suivant sera toujours 101.
Juste une pensée, si ce que vous vouliez était le dernier numéro automatique que vous avez inséré sur une connexion déjà ouverte, essayez d'utiliser:
SELECT @@IDENTITY FROM...
de cette connexion. C'est le meilleur moyen de suivre ce qui vient de se passer sur une connexion donnée et d'éviter les situations de concurrence avec d'autres connexions. Obtenir l'identité maximale n'est généralement pas réalisable.
le max (id) vous donnera le nombre maximum dans la liste pf employee_master
par exemple. id = 10, 20, 100 donc max vous obtiendrez 100
Mais lorsque vous supprimez l'enregistrement, ce ne devait pas être 100
Donc, vous obtenez toujours 100 en arrière
Une raison importante pour moi de dire que cela pourrait être le problème parce que vous n'utilisez pas order by id dans votre requête
Si vous utilisez Microsoft SQL Server. Utilisez cette instruction pour obtenir la valeur d'identité actuelle de la table. Ajoutez ensuite la valeur de base que vous avez spécifiée au moment de la conception de la table si vous souhaitez obtenir le prochain identifiant.
SELECT IDENT_CURRENT(<TableName>)
Pour MS SQL 2005 et supérieur:
Select Cast(IsNULL(last_value,seed_value) As Int) + Cast(increment_value As Int) As NextID
From sys.identity_columns
WHERE NAME = <Table_Name>
select isnull((max(AddressID)+1),1) from AddressDetails