2017-05-04 2 views
0

Je développe une application Windows Form C# et j'ai besoin d'insérer un enregistrement dans une table, puis relire l'identité de l'enregistrement et transmettre cette identité à une autre partie du programme. Voir le code ci-dessous.Comment lire l'identité d'un enregistrement inséré dans une table de base de données avec Pervasive SQL?

L'ID_COLUMN est d'identité de type PSQL. Remarque:

Le langage Pervasive ne prend pas en charge SCOPE_IDENTITY. Dans la documentation, @@ identity renvoie la valeur de la dernière colonne Identity insérée. Si la table n'a pas de colonne d'identité, @@ identity renverra null. Si vous avez deux insertions, l'identité @@ renvoie la dernière valeur insérée.

Autres notes: La version omniprésente est v11 et utilise le fournisseur de données fourni avec Pervasive.

using Pervasive.Data.SqlClient; 

int newIdentity = 0; 
string connectionString = 
    "Server Name=myServerAddress;Database Name=myDataBase;User ID=myUsername;" 
PsqlConnection connection = new PsqlConnection(connectionString); 
string insertStatment= 
    "INSERT INTO TABLE_1 (ID_COLUMN, DATA_COLUMN_1, DATA_COLUMN_2) " + 
    "  VALUES (0, 'My First Name', 'My Last Name')"; 
try{ 
    PsqlCommand insertCommand = new PsqlCommand(insertStatment,connection); 
    connection.Open(); 
    int rowCount = insertCommand.ExecuteNonQuery(); 
    if (rowCount > 0) 
     { 
     string selectIdentityStatment = 
      " SELECT @@IDENTITY FROM TABLE_1 "; 
     PsqlCommand selectIdentity = 
     new PsqlCommand(selectIdentityStatment, connection); 
     newIdentity = 
      (int)selectIdentity.ExecuteScalar(); // THIS IS RETURNING NULL 
     } 
     else 
     { // nothing was inserted 
      // newIdentity = 0 
     } 
     } 
Finally { 
     Connection.Close(); 
     } 

Toute aide serait grandement appréciée.

+0

J'ai exécuté votre code contre mon serveur PSQL v11.30 et il a renvoyé la valeur correcte pour l'identité. Quelle version exacte de PSQL utilisez-vous? Quelle est la version de Pervasive.Data.SqlClient.DLL que vous utilisez? – mirtheil

+0

Pervasive.Data.SqlClient.DLL Runtime Version v2.0.50727, Version 4. J'utilise .NET frame work 4.0 –

+0

Aussi - ce code fonctionne sur notre base de données de test. Lorsque nous nous connectons à nos données en direct, c'est quand les problèmes commencent. Parfois, cela va réussir, mais la plupart du temps, il échoue (à ce jour). Je suis blessé s'il y a un autre utilisateur ou processus qui intervient et crée un enregistrement, provoquant que le @ @ Identity Global soit mis à null avant que je puisse le relire. Est-ce que c'est possible? Et comment voulez-vous contourner la possibilité? –

Répondre

-1

La nouvelle version des fournisseurs Actian PSQL Ado.net est disponible avec PSQL V12 et V13. S'il vous plaît laissez-nous savoir s'il y a des problèmes avec les versions actuelles.

+0

J'ai downvoted votre réponse parce qu'à mon humble avis il aurait été plus approprié de simplement commenter. –

+0

Je suis assez sûr que le problème n'est pas dans les fournisseurs ado.net. J'obtiens les mêmes résultats si j'exécute la requête du Pervasive Command Center et que j'ai le même comportement. –