Possible de récupérer l'IDENTITÉ de la valeur de la colonne à insérer à l'aide de SqlCommandBuilder (sans l'aide de procédures Stockées)?
Pour info: je suis en cours d'exécution sur dotnet 3.5 SP1
Je suis en train de récupérer la valeur d'une colonne d'identité dans mon dataset après avoir effectué une mise à jour (à l'aide d'un SqlDataAdapter et SqlCommandBuilder).
Après l'exécution de SqlDataAdapter.Mise à jour(myDataset), je veux être en mesure de lire les auto-assignée valeur de myDataset.tables(0).Rows(0)("ID")
, mais c'est le Système.DBNull (malgré le fait que la ligne a été insérée).
(Note: je ne veux pas écrire explicitement une procédure stockée pour ce faire!)
Une méthode souvent posté http://forums.asp.net/t/951025.aspx modifie le SqlDataAdapter.InsertCommand et UpdatedRowSource comme suit:
SqlDataAdapter.InsertCommand.CommandText += "; SELECT MyTableID = SCOPE_IDENTITY()"
InsertCommand.UpdatedRowSource = UpdateRowSource.FirstReturnedRecord
Apparemment, cela semblait fonctionner pour beaucoup de gens dans le passé, mais ne fonctionne pas pour moi.
Une autre technique: http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=619031&SiteID=1 ne fonctionne pas pour moi non plus, comme après l'exécution de la SqlDataAdapter.Mise à jour, le SqlDataAdapter.InsertCommand.Collection de paramètres est remis à l'original (perte de la ajoutée supplémentaire en paramètre).
Personne ne connais la réponse???
Je sais que c'est vieux, mais dans vs 2015 c'est encore très buggé. J'ai eu le même problème et était déjà à l'aide du code à partir de l'article ci-dessus. Pour moi la solution était de le renommer "set ID pour SCOPE_IDENTITY()" à "SCOPE_ID = SCOPE_IDENTITY()" Oui, je sais il n'y a pas de réelle différence, mais maintenant il fonctionne de nouveau pour une raison quelconque
OriginalL'auteur tbone | 2008-09-25
Vous devez vous connecter pour publier un commentaire.
C'est un problème que j'ai couru en avant, le bug semble être que lorsque vous appelez
da.Mise à jour(ds);
les paramètres du tableau de commande insert est remis pour le premier de la liste qui a été créé à la forme de votre commande builder, il supprime plus de paramètres de sortie de l'identité.
La solution est de créer un nouvel objet dataAdapter et de copie dans les commandes, puis utiliser cette nouvelle afin de faire votre da.mise à jour(ds);
comme
OriginalL'auteur Ray Fitzharris
La commande insert peut être invité à mettre à jour l'enregistrement inséré en utilisant soit les paramètres de sortie ou les premiers enregistrements retournés (ou les deux) à l'aide de la UpdatedRowSource propriété...
Si vous souhaitez utiliser une procédure stockée, vous auriez fait. Mais vous voulez utiliser un raw de commande (aka la sortie de la commande du générateur), ce qui ne permet pas de soit a) les paramètres de sortie ou b) retour d'un enregistrement. Pourquoi est-ce? Bien un) c'est ce que votre InsertCommand va ressembler...
Il n'y a pas moyen d'entrer un paramètre de sortie de la commande. Alors que pensez-b)? Malheureusement, le DataAdapter exécute la commande Insert en appelant les commandes méthode ExecuteNonQuery. Cela ne veut pas retourner tous les enregistrements, il n'existe aucun moyen de la carte de mise à jour de l'enregistrement inséré.
De sorte que vous devez soit utiliser une procédure stockée ou d'abandonner sur l'utilisation de l'objet DataAdapter.
Tous les exemples que j'ai vu utilisé des procédures stockées. UpdatedRowSource fonctionne très bien avec des procédures stockées. Qui n'a pas utiliser des procédures stockées n'ont pas été à l'aide de DataAdapters.
OriginalL'auteur dbugger
Ce qui fonctionne pour moi est la configuration d'un MissingSchemaAction:
Cela me permet de récupérer la clé primaire (si c'est une identité, ou numéroauto) après une insertion.
Bonne chance.
OriginalL'auteur Rob Vermeulen
J'ai eu le même problème. Il vient d'être résolu lorsque j'ai cloné la commande généré par le commandbuilder. Il semble que même lorsque vous changez de commandText de l'insertcommand, il ne cesse de se la commande généré par le Commandbuilder...
Ici c'est le code que j'ai utilisé pour cloner la commande...
OriginalL'auteur Pedrao
Si vous voulez juste (a) insérer un enregistrement dans la table, (b) l'utilisation d'un jeu de données, et (c) ne pas utiliser une procédure stockée, vous pouvez suivre ce:
Créer votre objet dataAdapter, mais dans l'instruction select ajouter, OÙ 1=0, de sorte que vous n'avez pas à télécharger l'intégralité de la table - une étape facultative pour la performance
Créer une instruction INSERT avec la portée de l'identité de l'instruction select et un paramètre de sortie.
Faire le traitement normal, le remplissage de l'ensemble de données, d'ajouter l'enregistrement et l'enregistrement de la mise à jour de table.
Devriez maintenant être en mesure d'extraire de l'identité à partir du paramètre directement.
Exemple:
Mais c'est assez de longue haleine à faire la même chose que ce...
OriginalL'auteur Jay Kidd
J'ai trouvé la réponse qui fonctionne pour moi ici: http://www.dotnetmonster.com/Uwe/Forum.aspx/dotnet-ado-net/4933/Have-soln-but-need-understanding-return-IDENTITY-issue
Code qui a travaillé (à partir du site - attribué à Girish)
OriginalL'auteur Mladen Mihajlovic
En fait, cela fonctionne pour moi :
Acclamations.
OriginalL'auteur
Si les autres méthodes ne fonctionnent pas pour vous, les .Net fourni des outils (SqlDataAdapter) etc. n'offrent pas vraiment grand-chose en matière de flexibilité. Vous aurez généralement besoin de le prendre au prochain niveau et commencer à faire les choses manuellement. Procédure stockée serait un moyen de continuer à utiliser le SqlDataAdapter. Sinon, vous avez besoin pour passer à un autre outil d'accès aux données .Net bibliothèques de données ont des limites car ils de conception simple. Si votre modèle ne fonctionne pas avec leur vision, vous avez passer votre propre code à un certain point/niveau.
OriginalL'auteur Jon Adams
Le problème pour moi a été d'où le code a été placé.
Ajouter le code dans le RowUpdating gestionnaire d'événement, quelque chose comme ceci:
OriginalL'auteur David
En fait, il est encore plus facile, pas besoin de toutes les commandes personnalisées. Lorsque vous créez tableadapter dans le concepteur de dataset, de préciser "actualiser les données de la table" dans les Options Avancées de l'assistant. Avec cela, une fois que vous émettez dataadapter.mise à jour mydataset , vous trouverez identifier la colonne dans la table de données renseignée avec la nouvelle valeur de la base de données.
OriginalL'auteur Vadim Rapp
Ma solution:
OriginalL'auteur esc
Une autre façon en utilisant simplement un objet de commande.
OriginalL'auteur Eric Schneider
Avez-vous regardé dans l'aide de LINQ à la place? Je comprends que ce n'est pas l'adresse de votre question, mais si vous êtes en utilisant .NET 3.5, vous devriez vraiment essayer d'utiliser LINQ. En effet, avec l'avènement du Premier Code EntityFramework, je pense que vous pouvez facilement choisir de LINQ to SQL ou EF comme relativement léger alternatives à rouler votre propre DAL.
OriginalL'auteur tvanfosson