[Access] Procedures stockées et parametres

Procedures stockées et parametres [Access] - VB/VBA/VBS - Programmation

Marsh Posté le 20-10-2005 à 23:11:39    


Bonjour !
 
Besoin d'un petit coup de pouce.. En passant par Ado.NET, je veux faire l'update de ma base de données Access.
 
- Je passe les détails tels que connection, dataset.. tous fonctionne correctement
 
- J'utilise un dataadapter, ou j'ai moi-même fais les COMMAND
(pour l'instant j'utilise SELECT et INSERT pour mes tests)
 
- J'ai crée des procedures stockées sous access, en SQL
 
- La procédure stockées pour l'INSERT recoit 2 parametres. (un integer, une string)
 
 
 
Le problème :
 
Lorsque je lance l'update à partir de mon application Vb.Net (donc dataadapter.update(dataset, datatable)), ça marche.
Par contre, ça ne marche toujours que pour un seul enregistrement. Le premier.
 
Après, l'update a un comportement très étrange.
 
Voyez le résultat :
 
supposons que dans mon dataset j'ai :
 
1 aaaaaa
2 bbbb
3 cccccccc
 
et bien l'update va enregistrer cela dans le fichier :
 
1 aaaaaa
1 bbbbaa
1 cccccc
 
 
 
Vraiment étrange.. non ?
 
- le premier champ (l'integer) reste sur celui donné en premier
- la longueur totale du deuxieme champ (la chaine) sera toujours égale a la longueure de la premiere string donnée
- quand la string est plus petite, elle est quand même allongé avec des valeures de la premiere string
 
 
 
 
 
Si quelqu'un a déjà eu un comportement semblable merci de m'aider ! Je ne trouve pas :(
Mon code a pourtant l'air correct. J'ai l'impression que c'est autre chose.
 
 
 
Voici le code de la procedures stockees sous access (INSERT), au cas ou :
 
INSERT INTO tbl_Personne ( personne_Id, Nom )
VALUES (int_id, chn_nom);
 
j'ai aussi essayé :
 
PARAMETERS [int_id] Short, [chn_nom] Text ( 80 );
INSERT INTO tbl_Personne ( personne_Id, Nom )
SELECT [int_id] AS Expr1, [chn_nom] AS Expr2;
 
Pour les deux, même résultats. A partir d'access directement, ça marche.
A partir de vb.net, ça marche (une fois)
dès qu'il y a plusieurs colonnes dans le dataset, ça plante :(
 
 
On dirait que la valeure passée en paramètre pour la premiere ligne est "gardé" par access.......
 
Merci d'avance
-Axis-

Reply

Marsh Posté le 20-10-2005 à 23:11:39   

Reply

Marsh Posté le 20-10-2005 à 23:23:45    

Tu utilises comment tes procédures stockées ? T'as des objets OleDbDataCommand ?

Reply

Marsh Posté le 20-10-2005 à 23:44:42    


Oui c'est ça. Voici mon code :
 
 
        Dim stp_commande_insert As New OleDbCommand("stp_insert", con_connection_bdd)
        stp_commande_insert.CommandType = CommandType.StoredProcedure
        stp_commande_insert.Parameters.Add("int_id", OleDbType.Integer, 4, "personne_Id" )
        stp_commande_insert.Parameters.Add("chn_nom", OleDbType.Char, 80, "Nom" )
 
        dataadapt.InsertCommand = stp_commande_insert
 
 
Je declare une commande Oledb, avec le nom de la procedure stockee et la connection;
J'ajoute les parametres, dans le bon ordre,
et j'associe cette command au dataadapter
 
Ca a l'air correct de ce côté je pense ..

Reply

Marsh Posté le 21-10-2005 à 07:57:25    

Y'a un évènement sur le DataAdapter, RowUpdating, qui se lance juste avant de mettre à jour une Row dans la source de données. Dans les données de l'évènements, tu peux récupérer ta DbCommand, et regarder la gueule qu'elle tire, à ce moment-là les paramètres ont été logiquement remplacés par leur valeurs respectives...

Reply

Marsh Posté le 21-10-2005 à 08:12:25    

J'ai découvert quelque chose : j'ai décidé d'essayer sans le dataadapter.
Je lançais donc la procedure stockée de manière "manuelle". Ca me permettais de voir si les valeures étaient mise à jour.
 
Et bien elles l'étaient, mais même comme cela, le résultat dans le fichier *.mdb était le même.
 
J'ai donc modifier un peu le code et j'ai ajouter la création + déclaration des paramettres juste avant de lancer la procédure stockée... et j'ai mis un ...parameters.clear pour les effacer juste après.
 
Résultat : ça marche enfin.
 
Je ne comprend pas trop, et cela m'embête de ne pas pouvoir utiliser le dataadapter.. car il va falloir gérer les update manuellement :
si rowstate = added alors ...etc
idem pour les effacé et idem pour les modifiés.
 
Le dataadapter fait tout ça lui......
 
Donc, avant le dataadapter modifiait la valeur des parametres et ça plantait.
Moi, manuellement, faisais de même. Je modifiais la valeure en gardant toujours les mêmes parametres existants, ça plantait.
Finallement, en effacant les objets parametres et en les re-créant, ça marche..
 
mais alors, comment faire avec un dataadapter ??
peut-être avec une function as oledbcommand ? cette function donnerait la commande en string sql, la connection, les parametres.....ca voudrait dire qu'à chaque ligne, la function serait lancée ? Pas très 'optimisé'   :(
Mais c'est tout ce que je vois, car apparement il faut recréer les objets parametres a chaque fois...
 
Je ne comprends vraiment pas pourquoi le fait de modifier la valeur des parametres n'est pas suffisant...


Message édité par axis le 21-10-2005 à 08:16:32
Reply

Marsh Posté le 21-10-2005 à 11:49:50    

Faut faire comme t'as fait au-dessus, sauf qu'il faut préciser la requête INSERT. Puis, à la place des noms de paramètres metter des points d'interrogation, puis ajouter les paramètres dans l'ordre d'apparition, comme tu l'as fait

Reply

Marsh Posté le 23-10-2005 à 07:47:03    

J'ai decidé de ne plus utiliser de dataadapter. Je fais tout manuellement maintenant.
Plus de code mais c'est mieux :)
Je recré les parametres a chaque fois et ca marche..
;)

Reply

Marsh Posté le 23-10-2005 à 14:42:45    

Mouais, c'est pas super-top, sachant que les DataAdapter sont un peu la façon standard de faire tout ça :(

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed