2010-04-08 11 views
2

Je travaille avec une application héritée que j'essaie de modifier pour qu'elle puisse fonctionner avec SQL CE, alors qu'elle a été écrite à l'origine contre SQL Server. Le problème que j'obtiens maintenant est que quand j'essaye de faire dataAdapter.Update, SQL CE se plaint qu'il n'attend pas le mot-clé SELECT dans le texte de commande. Je crois que c'est parce que SQL CE ne supporte pas les commandes SELECT par lots.Que font ces commandes de table générées automatiquement par .NET? par exemple. UPDATE/INSERT suivi d'un SELECT

La commande adaptateur de table généré automatiquement ressemble à ceci ...

this._adapter.InsertCommand.CommandText = @"INSERT INTO [Table] ([Field1], [Field2]) VALUES (@Value1, @Value2); 
SELECT Field1, Field2 FROM Table WHERE (Field1 = @Value1)"; 

Que fait-il? Il semble qu'il insère de nouveaux enregistrements du datatable dans la base de données, puis relire cet enregistrement de la base de données dans le datatable? Quel est le point de cela? Puis-je simplement parcourir le code et supprimer toutes ces instructions SELECT? Ou existe-t-il un moyen plus simple de résoudre mon problème de vouloir utiliser ces adaptateurs de données avec SQL CE?

Je ne peux pas régénérer ces adaptateurs de table, comme les gens qui savaient depuis longtemps partir.

Répondre

1

Il suffit de mettre à jour l'objet avec les dernières valeurs de la base de données, après une mise à jour. J'ai toujours semblé un peu inutile pour moi mais bon ...

Ce sont des nuisances du point de vue de la maintenance - si vous avez l'option, vous vous épargnerez beaucoup de tracas en faisant abstraction de tout cela à un bon niveau. couche de données.

+0

Il est logique que vous récupériez des champs auto-incrémentés/identité/rowguid mais ici cela semble un peu superflu. +1 pour me battre dessus. – Lazarus

+0

@Lazarus, Mmm, je suis d'accord, j'ai toujours pensé que c'était un peu exagéré même pour ça. Je pense qu'il est également utilisé pour définir les champs qu'il croit être les actuels dans la base de données, pour la vérification de la simultanéité (que je n'ai jamais aimé non plus). – Paddy

+0

Ah ... c'est intéressant. J'ai essayé d'enlever le SELECT des textes de commande, et j'ai eu une exception de violation de concurrence. Pensez-vous que les SELECT sont nécessaires pour éviter cette erreur, ou pourrait-il être autre chose? – RickL

0

permet que les valeurs de champ puissent être modifiées par le (s) déclencheur (s) sur la table. Assez sensible, j'aurais pensé, dans un passe-partout auto-généré.

si l'instruction select est un peu étrange à supposer que field1 est la clé primaire ... mais peut-être le code autogen s'assure qu'il est avant de générer ce bit de code.

+0

Oui, le code généré automatiquement sélectionnera dans les champs de clé primaire. L'exemple que j'ai fait ci-dessus était du code "aseptisé". – RickL