Mise à jour base de données SQL Distante

Signaler
Messages postés
2813
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
-
Messages postés
2813
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
-
Bonjour,

J'ai uun projet avec une source de données (SQL Serveur 2005 distant).

J'ai créer un DataSet en mode Design (Fichier XSD), J'ai ajouter un TableAdapter lié avec une Table de ma base.

J'ai un formulaire ou se trouve d'une part un DataGrid et de l'autre Un BindingNavigator avec des TextBox et autres.

J'ai lié mon DataGrid et mon BindingNavigator et ses contrôles à mon TableAdapter (celui de la table client), et Visual Basic m'a créer un BindingSource.

Tous mes contrôles sont donc reliés à ce BindingSource, qui à comme source de données la Table Client de mon DataSet, Via un Table Adapter !

Tout ceci est merveilleux et je n'ai eu à saisir aucune ligne de code, même les procédures SQL sont celles généré par défaut !

Tout marche impecable, ma feuille m'affiche les enregistrements, et je navigue, en ajoute, supprime, modifie, le gros soucis c'est que la base de données distante ne se met jamais à jour ! La table généré par le TableAdapter est en local, et celle ci n'est jamais mise à jour par ce TableAdapter, or, celui-ci à été créé en mode design via le DataSet et j'ai coché les option de mise à jour automatique !

Quelqu'un aurait-il une réponse, j'ai cherché pendant 2 heures sans succès...

Autre précision, je ne souhaite pas utiliser une méthode TableAdaper.Update(DataSet, "NomTable"), car je souhaite une mise à jour en temps réel, en gros si j'ai 5000 enregistrements dans ma table, je n'ai pas envie de renvoyer une reqûete contenant 5000 lignes pour seulement un champ de modifier...

C'est bien beau tout ces assistants et cie mais pour traiter en locale je ne vois pas l'intérêt.

Si quelqu'un peu éclairer ma lantèrne... Merci à vous.

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.

11 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
80
Salut
Je te le dis de suite, je n'ai jamais travaillé avec .Net

Qui te dit qu'un Update renvoie la totalité des données ?
Il y a peut-être une gestion intelligente du DataSet qui sait ce qui a été modifié et ne renvoie (peut-être) que les lignes modifiées.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
2813
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
38
Salut Jack !

En fait un TableAdapter est une classe qui permet d'envoyé des reqêtes (4 types: SELECT, INSERT, UPDATE, DELETE)

Le méthode update du TableAdapter à été généré en auto par le SQLCommandBuilder (je suppose), elle on été faite à partir des assistants de VS.

Le Table Adapter récupère les données de ma table sur le serveur et les places dans une Table en mode déconnecté, donc si j'ai 10 lignes de modifiés sur 5000, et une seule reqûete Update Je devrais forcément renvoyé ma table en mode déco, pour que le serveur puisse traiter la demande (il lui faut les nouvelles valeur) en suite, le serveur va comparé les 2 tables et trouvé les lignes modifier pour les mettres à jour, c'est du grand nimporte quoi...

De plus, tout est automatisé, mais il faut faire appeler la requete Update à la main !

En gros j'automatise tout mais je suis obligé de placer une méthode TableAdapter.Update dans chaque procédure événementiel de mes contrôles, c'est pas possible!

A mon avis c'est un truc simple mais bon...

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
Messages postés
1402
Date d'inscription
mardi 1 mai 2007
Statut
Membre
Dernière intervention
7 octobre 2012
5
Salut,

Je connais pas trop le Table Adapter,
mais si cellui-ci a un événement majeur , style AfterUpdate ou tout autre du genre,, tu pourras y placer une requete mise à jour pour le seul enregistrement en cours.Il suffit, en plus du nom de la table destination,
de préciser le chemin de la base externe précèder du mot clé IN.
[] Ce qui va sans dire. va mieux en le disant.
Messages postés
120
Date d'inscription
samedi 3 mai 2008
Statut
Membre
Dernière intervention
18 juillet 2013
1
salut ,

le DataBinding permet de lié tes controls au dataset c tous,
pour mètre la base de données a jour tu dois
appeler la méthode update du TableAdapter
mais avant cela
il faut crée une requête de maj paramétrée ou tu peu utilisé le commandebuilder c plus simple.

dans la proc click du button enregistré :

Dim CB as new sqlcommandbuilder(TableadapterClient)

TableadapterClient.update(tondataset.tableclient)

@+
Messages postés
2813
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
38
Mouais c'est bien ce que je pensais de la pur et grosse M****

Je suis trop dégouté c'était trop beau...

Ou est l'intéret de lier les contrôles au données si celle-ci ne sont pas en temps réel ???

Oué ok, vous allez me dire, tu fais un bouton enregistrer et tu glisse une méthode Updtae dedans mais alors, si je charge 5000 enregistrements pour simplement en modifier un seul et que je dois revoyer la totalité de ceux-ci c'est du bouffage de bande passante pour rien et de plus c'est lent !

C'est totalement débile, je ne sais pas moi, il auraient pu faire une méthode dans le BindingSource, qui récupère l'événement lié à la table (ajout, suppression, modification) et qui se sert du TableAdaper pour envoyé la requête adéquate,
du style, Je supprime une ligne, il garde les infos de celle-ci, appelle la méthode delete du TableAdapter en lui passant en paramètre la clé primaire. C'est à peu près le cas en Asp.Net, lors ce qu'on à un DataGrid à l'écran, c'est la mise à jour de la base du site qui se fait directement, pas une m**** de table locale qui sert à rien...

Aussi pour répodre à LIBRE_MAX, c'est la DataTable qui possède les événement, le seul événement que j'ai pu voir (après un F2) dans le TableAdapter est 'Dispose'. Mais même dans ce cas la, si une ligne est supprimé de la base locale, je suis obligé de faire un :

TableAdapter.Update(DataTable) et non TableAdapter.Update(DataRow) Car celui-ci n'existe plus, par contre cela fonctionne pour la modification.

C'est quand même dingue, je suis obligé d'envoyé la table complète au serveur pour seulement une ligne !

Je ne sais pas comment faire, mon projet est énorme, si je dois récupérer chaques événements de chaques contrôles et retrouver lequel appartient à quelle ligne puis envoyer les requêtes select, update, delete et cie au serveur en les saisissant manuellement dans 10ans mon programme sera peut être fini...

Enfin, désolé de vous faire ressentir mon mécontentement, un grand merci à vous pour vos réponses.

Cordialement, Mayzz.

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
Messages postés
1402
Date d'inscription
mardi 1 mai 2007
Statut
Membre
Dernière intervention
7 octobre 2012
5
il doit bien y avoir un événement BeforeDelete, pour que tu puisses sauver la référence de la ligne qui est sur le point d' être supprimée..

Je ne sais pas pour le Table Adapter, mais pour le DataGrid les évenements auxquels je fais allusion, tu le sais certainement, éxistent bel et bien.
Essaies de voir donc dans cette perspective.
Bonne continuation.

[] Ce qui va sans dire. va mieux en le disant.
Messages postés
2813
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
38
Merci LIBRE_MAX,

En fait, je suis déçu car même si les événements dans le DataGrid existe bel et bien, il faut saisir du code, or le but du DataBindig est justement d'éviter le Code.

En effet même avec le N° de ligne, il faut du code dans chaque procédures, faire les requêtes SQL etc... De plus ma base de données est lié avec un DataGrid, mais aussi avec un BindingNavigator et des champs, du coup pour chaque champ modifié il faudrais du code... Vu l'empleur de mon projet je ne peux pas procéder de cette façon.

C'est pas que je suis fénéant, mais bon en voyant le databinding je me suis dit que je gagnerais du temps pour la liaison aux données apparemment le databinding ne sert que pour les bases locales.

@+ et merci encore.

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
36
Salut,

J'ai du mal a suivre la conversation, mais je vais tenter de faire avancer le probleme.

On peut charger plusieurs tables dans un dataset
et mettre des relations et contrainte entre elles.

Un seul update sur le dataset permet de mettre a jour toutes les tables en respectant les contraintes.

Le principe mise en place pour la sauvegarde est un systeme de version sur les row de chaque datable. (datarowstate et datarowview)
cf lien

Ensuite en interne un diffgramme "xml de modification" est généré et est exécuté sur la base,
car un dataset est une structure XML derriere, et est basé sur un design patttern Unit Of Work.
cf lien

Le sujet des dataset et du mode déconnecté est tres vaste.
Messages postés
2813
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
38
Hello !

Merci pour ces quelques précisions. Mais je suis toujours coincé, en vrais, il faudrais que j'arrive à retrouver les événement :

RowAdding, Deleting, Updtating, ces événements existe mais c'est très confus...

J'aimerais par exemple:

Sub MaTable_RowDeleting (ByVal sender As Object, e As System.Data.DataRowChangeEventArgs) Handles MaTable.RowDeleting

Dim R as MonDataSet.MaTableRow = e.Row

'Lors de la suppression d'un row dans ma Table en mode déconnecté
If MonTableAdapter.Delete(R.ID, R.FirstName, R.LastName) = 0 then
'Si il y a un souci de mise à jour de ma Table distante,
'Annuler l'ajout de ce row dans la Table locale
'or "e", n'as pas de méthode cancel ou autres.
End If

End Sub


Il faudrait aussi géré les autres types d'événements de cette façon, seulement, ceux-ci sont déclanchés un peu nimporte comment lors de la navigation, en effet, des que je click dans mon DataGrid un événement RowChanging est déclanché (autant de fois qu'il y a de colonnes dans le DataGrid) alors qu'aucune valeur n'a été modifié. C'est mal géré, pour moi RowChanging veut dire ce que cela veut dire !

De toute façon c'est très mal géré quand on voit le code généré par le DataSet ça fait peur !

@+

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
36
Il y a pas besoin de travailler sur les évenements normalement.

A moins que tu veux répercuté en directe les modifications sur ta base de données.

Et la je ne vois plus l'intérêt de passer par un mode déconnecté.
Messages postés
2813
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
38
Oui, biensur, c'est exactement ce que je souhaite, mais l'intéret des composants d'ADO.Net, c'est leur automatisme, pour les requêtes et les liaisons. Je ne peux pas saisir toutes les procédures à la main, rien que pour la saisie des clients, il y a déja 25 champs, donc je me vois mal saisir du code à la place de mettre des databinding !

Idem pour le datagrid, il faudrait que je le remplisse par code, et que dans chaque événement j'envoi une requête SQL. C'est impossible dans 10 ans j'y suis encore !

J'ai trouvé une soluce en attendant, je place un Update dans le BindingCompleted de mon DataGrid, Ainsi, pour chaque événement :

- Modification des données Via DataGrid ou Champs.
- Le BindingSource Met à Jour la Table Locale.
- Le Binding se fait vers les composant car la source de données a changé.
- Fin du binding => Si Table.GetChanges n'est pas Null TableAdapter.Update

Cela fonctionne, sauf une erreur avec le GetChange, j'ai fais un nouveau topic.

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.