Arriver @@IDENTITÉ de TableAdapter
Je suis en train de terminer une tâche apparemment simple qui s'est transformée en une de plusieurs heures d'aventure: Arriver @@Identity
de TableAdapter.Insert()
.
Voici mon code:
protected void submitBtn_Click(object sender, EventArgs e)
{
AssetsDataSetTableAdapters.SitesTableAdapter sta = new AssetsDataSetTableAdapters.SitesTableAdapter();
int insertedID = sta.Insert(siteTxt.Text,descTxt.Text);
AssetsDataSetTableAdapters.NotesTableAdapter nta = new AssetsDataSetTableAdapters.NotesTableAdapter();
nta.Insert(notesTxt.Text, insertedID, null,null,null,null,null,null);
Response.Redirect("~/Default.aspx");
}
Un réponse suggère tout ce que je peut avoir à faire est de changer le ExecuteMode
. J'ai essayé aussi. Cela rend GetData()
cesser de travailler (parce que je suis de retour d'un scalaire maintenant, au lieu de rowdata) (j'ai besoin de garder GetData()). Elle ne résout pas le problème dans le insertedID variable est toujours à 1.
J'ai essayé de créer un deuxième TableAdapter
dans le TypedDataSet.XSD
et la définition de la propriété pour que la carte de "scalaire", mais il ne parvient toujours pas avec la variable d'obtenir une valeur de 1.
Générés commande insert est
INSERT INTO [dbo].[Sites] ([Name], [Description]) VALUES (@Name, @Description);
SELECT Id, Name, Description FROM Sites WHERE (Id = SCOPE_IDENTITY())
Et le "Rafraîchir les Données de la Table" (ajoute une instruction select après les instructions Insert et Update pour récupérer l'Identité" est également définie.
Environnement
SQL Server 2008 R2, Visual Studio 2010, .NET 4, Windows XP, tous les locaux même de la machine.
Ce qui cause cela?
MODIFIER/METTRE À JOUR
Je tiens à préciser que je suis l'aide de l'auto-code généré par Visual Studio. Je ne sais pas quel "outil" qui a généré le code est bien, mais si vous double-cliquez sur l' *.Fichier XSD, il affiche une INTERFACE utilisateur de la Table SQL du Schéma et associés TableAdapter. Je veux continuer à utiliser le code généré automatiquement et en quelque sorte à permettre l'obtention de l'Identité. Je ne veux pas écrire tout cela à la main avec des procédures stockées.
SCOPE_IDENTITY()
ou IDENT_CURRENT(tablename)
au lieu de @@IDENTITY
. Le @@IDENTITY
valeur pourrait ne pas être ce que vous attendez (c'est le dernier IDENTITÉ généré dans toutes les tables qui ont été impliqués dans la dernière transaction, y compris celles qui pourraient faire l'objet d'un INSERT à partir d'un déclencheur ou quelque chose comme ça).Juste une remarque sur votre modifier le code généré automatiquement ramasse sur les changements dans votre sprocs - comme dans ma réponse ci-dessous, vous seulement besoin de modifier les 2 lignes de code pour obtenir l'effet désiré. Je ne pense pas qu'il y ait une autre façon.
OriginalL'auteur P.Brian.Mackey | 2010-09-13
Vous devez vous connecter pour publier un commentaire.
Voici mon Code SQL qui fonctionne.
Puis quand j'ai créer la Table de Carte, je peux voir instantanément l' @InsertedID paramètre.
Puis à partir du code, tout ce que je fais est:
Je ne suis pas à 100% si l'aide de ref est la meilleure option, mais cela fonctionne pour moi.
Bonne chance.
Non, mais vous pouvez aller modifier la procédure stockée existante, ajouter @InsertedID dans la section paramètres, puis SÉLECTIONNEZ ajouter @InsertedID = SCOPE_IDENTITY() sur la dernière ligne. Lorsque vous cliquez ensuite sur "Configurer" sur votre table adaptateur, vous devriez voir une colonne supplémentaire. Vous n'avez pas à supprimer votre sprocs - vous êtes juste l'ajout de 2 nouvelles lignes.
J'aime bien ton idée. Je peux ajouter le paramètre, mais pour une raison quelconque, quand j'ai modifier le CommandText de "INSERT INTO [Sites] ([Nom], [Description]) VALUES (@Nom @Description); SELECT Id, Nom, Description DE Sites (Id = SCOPE_IDENTITY ())" de ...à... "INSERT INTO [Sites] ([Nom], [Description]) VALUES (@Nom @Description); SELECT Id, Nom, Description DE Sites (Id = SCOPE_IDENTITY());SELECT @InsertedID = SCOPE_IDENTITY() " Mon insert est corrompu et ne montre aucun des paramètres à tous dans le C#. Je vais devoir prendre cette place à nouveau demain.
Pas de soucis - lorsque vous obtenez une chance peut vous coller votre nouveau code SQL comme une modification à votre question ?
Cela fonctionne, mais assurez-vous de changer la CommandText avant de créer le paramètre lorsque vous utilisez le menu "propriétés" dans visual studio. Pour une raison quelconque, lorsque vous modifiez le CommandText les Paramètres de réinitialisation. La finale de SQL, j'ai utilisé: "INSERT INTO [Sites] ([Nom], [Description]) VALUES (@Nom @Description); SELECT Id, Nom, Description DE Sites (Id = SCOPE_IDENTITY()); SELECT @InsertedId = SCOPE_IDENTITY()". Je viens de appeneded "; SELECT @InsertedId = SCOPE_IDENTITY()" pour le sql généré.
OriginalL'auteur Marko
La vraie réponse:
Notes:
Réglage de la ExecutMode à Scalaire est possible via les Propriétés de votre générés Requête d'Insertion. (appuyez sur F4).
Dans ma version (Visual Studio 2010 SP1 ) l'instruction select a été généré automatiquement.
OriginalL'auteur Remco
Toutes les infos sont ici, mais je n'ai pas trouvé de réponse unique, donc voici la procédure complète que j'utilise.
Ajouter une requête d'insertion, et l'ajout des
SELECT SCOPE_IDENTITY()
, comme:Assurez-vous d'ajouter un ; à la fin de l'instruction INSERT VS crée pour vous.
Après que vous avez Fini d'ajouter requête de l'assistant, assurez-vous que la requête est sélectionnée dans la vue de conception puis changement de Mode d'Exécution de
Scalar
dans le volet des propriétés.Assurez-vous d'utiliser Convertir.ToInt32() lorsque vous appelez la requête à partir de votre code, comme suit:
Vous n'obtiendrez pas des erreurs du compilateur sans les Convertir.ToInt32, mais vous aurez une mauvaise valeur de retour.
Aussi, chaque fois que vous modifiez la requête, vous devez réinitialiser le Mode d'Exécution de retour à
Scalar
, parce que VS va changer àNon Query
à chaque fois.Vous avez raison @AgapwIesu, désolé, vous ne savez pas comment je ne l'ai pas remarqué. C'était il y a 2 ans (maintenant), donc aucune idée. Je crois que je vais laisser ça ici, mais ne se sentent pas mauvais, si quelqu'un veut le supprimer.
OriginalL'auteur eselk
Voici comment faire (dans le Concepteur visuel)
Copier et coller votre SQL, il peut être multi-ligne, assurez-vous que le "Concepteur de Requêtes" ne pas ouvrir, car il ne sera pas en mesure d'interpréter les multiples commandes - mon exemple montre un exemple de "fusion" ensemble d'énoncés (à noter que les nouveaux SERVEURS commandes de Fusion).
Modifier/Ajouter l' @YourTable_ID Paramètres de la requête fenêtre propriétés/sidebar. Dans l'Éditeur de Collection paramètres, L'ID de paramètre doit avoir une Direction d'entrées-sorties, de sorte que la valeur est mise à jour lorsque la Table de l'Adaptateur de la fonction est appelée. (Note spéciale: assurez-vous que quelle que soit la colonne que vous faire des entrées-sorties que le concepteur ne dispose pas de cette colonne en "Lecture Seule" et que les types de données correspondent aussi bien, sinon modifier la colonne de la table de données ou les informations de paramètre en conséquence)
Cela devrait enregistrer le besoin d'écrire une procédure Stockée pour une activité simple.
Beaucoup De Wow. Vous remarquerez que cette méthode est un moyen rapide de faire la Couche de Données de fonctions sans avoir à casser dans le SQL de procédures et d'écrire une tonne de Procédures. Le seul problème, il y a beaucoup de danse que vous avez à faire...
OriginalL'auteur Negative Zero
Vous aurez besoin pour l'installation de l'insert pour retourner l'identité comme une valeur de sortie, puis de la saisir comme un paramètre dans votre carte.
Ces deux liens vous allez:
http://www.akadia.com/services/dotnet_autoincrement.html
http://msdn.microsoft.com/en-us/library/ks9f57t0.aspx
OriginalL'auteur klabranche
Vous avez exactement deux choix:
J'aimerais utiliser la requête SQL suivante et ExecuteScalar.
OriginalL'auteur gbn
Une façon est d'exécuter une requête de sélection après la commande insert. Un bon moyen consiste à envelopper l'original de la commande comme ceci:
-1 pour @@IDENTITY
OriginalL'auteur Aseem Gautam