2017-04-01 2 views
1

Je dois générer automatiquement un nouvel ID de compte sur mon application de formulaire de fenêtres de chargement. Ainsi, par exemple, lorsque les utilisateurs démarrent des fenêtres sous la forme "Ajouter un nouveau compte" dans la zone de texte "Identifiant du compte", je dois montrer la dernière valeur de la base de données. Si j'ai deux comptes dans la base de données sur Windows forme dans la valeur de la zone de texte sera trois.C# Générer un nouvel ID à partir de la base de données sous Windows forms application

Mon code fonctionne parfaitement si j'ai au moins un compte dans la base de données, mais quand ma base de données est vide j'ai eu une exception.

Ceci est mon code:

public int GetLatestAccountID() 
{ 
    try 
    { 
     command.CommandText = "select Max(AccountID)as maxID from Account"; 
     command.CommandType = CommandType.Text; 

     connection.Open(); 

     OleDbDataReader reader= command.ExecuteReader(); 

     if (reader.Read()) 
     { 
      int valueID = Convert.ToInt32(reader["maxID"]); 
      return valueID + 1; 
     } 

     return 1; 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 
    finally 
    { 
     if (connection!= null) 
     { 
      connection.Close(); 
     } 
    } 
} 

Aussi je trouve réponse sur StackOverflow:

object aa = DBNull.Value; 
int valueID = (aa as int?).GetValueOrDefault(); 

Mais cette ligne de code fonctionne si ma base de données est vide, mais quand j'ai un compte dans la base de données, il apparaîtra toujours sur mon formulaire Windows dans l'ID de compte textbox valeur un. J'utilise la base de données Microsoft Access 2007.

J'apprécie toute aide.

Répondre

0

Je devine que vous voulez:

public int GetLatestAccountID(string connectionString) 
{ 
    using(var dbConn = new OleDbConnection(connectionString)) 
    { 
     dbConn.Open(); 

     string query = "select Max(AccountID) from Account"; 
     using(var dbCommand = new OleDbCommand(query, dbConn)) 
     { 
      var value = dbCommand.ExecuteScalar(); 
      if ((value != null) && (value != DBNull.Value)) 
       return Convert.ToInt32(value) + 1; 

      return 1; 
     } 
    } 
} 

On dirait que vous ouvrez votre connexion de base de données une fois et en le laissant ouvert au cours de votre programme. Ne fais pas ça; cela conduit à des conditions de course et à la corruption de données. .NET implémente le regroupement de connexions à la base de données de sorte que vous n'améliorez pas du tout les performances en laissant les connexions ouvertes.

Vous ne nous dites pas non plus ce que vous utilisez GetLatestAccountID pour. Si vous essayez d'utiliser cela comme une clé primaire, vous allez également rencontrer des problèmes de conditions de course. Si vous voulez une clé primaire, vous devez laisser la base de données la créer et retourner la valeur après avoir créé l'enregistrement.

+1

Cela fait un certain temps mais 'ExecuteScalar' aidera au lieu de' ExecuteReader'. – shahkalpesh

+0

Oh, bonne idée @shahkalpesh! Édité. –

+0

Ça marche! Merci beaucoup!! Oui, c'est ma clé primaire, mais dans la base de données, je choisis d'être numéro, pas numéro automatique. –

0
public int GetLatestAccountID() 
{ 
    try 
    { 
     int accounts = 0; 

     command.CommandText = "select Max(AccountID)as maxID from Account"; 
     command.CommandType = CommandType.Text; 

     connection.Open(); 

     OleDbDataReader reader= command.ExecuteReader(); 

     if (reader.Read()) 
     { 
      accounts = Convert.ToInt32(reader["maxID"]) + 1; 
     } 

     return accounts; 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 
    finally 
    { 
     if (connection!= null) 
     { 
      connection.Close(); 
     } 
    } 
} 
+0

J'essaie cela, mais il ne fonctionnait pas. La solution consiste à utiliser Execute Scalar et non Execute Reader. Merci de répondre et d'essayer de m'aider. –

+0

Le problème n'est pas 'ExecuteReader', mais que' Convert.ToInt32 (reader ["maxID"]) 'ne fonctionne pas sur les colonnes NULLable. –

0

Pourriez-vous utiliser SELECT COUNT (nom_colonne) FROM nom_table; compter le nombre de comptes au lieu de choisir lequel est le plus grand?

+0

Oui mais cela ne fonctionne pas non plus si ma base de données est vide. La solution est d'utiliser: Execute Scalar not Execute Reader –

1

Vous pouvez simplifier encore comme ci-dessous,

Sélectionnez isnull (max (accountID), 0) comme maxid de compte