Possible d'obtenir PrimayKey Id de retour après un SQL BulkCopy?
Je suis à l'aide de C# et de l'aide SqlBulkCopy. J'ai un problème. J'ai besoin de faire une masse insérer dans une table, puis une autre masse insérer dans une autre table.
Ces 2 ont un PK/FK relation.
Table A
Field1 -PK auto incrementing (easy to do SqlBulkCopy as straight forward)
Table B
Field1 -PK/FK - This field makes the relationship and is also the PK of this table. It is not auto incrementing and needs to have the same id as to the row in Table A.
De sorte que ces tables ont une relation, mais je ne sais pas comment faire pour récupérer tous ceux PK Id que la masse insérer fait depuis que j'en ai besoin pour le Tableau B.
Modifier
Je pourrais faire quelque chose comme cela?
SELECT *
FROM Product
WHERE NOT EXISTS (SELECT * FROM ProductReview WHERE Product.ProductId = ProductReview.ProductId AND Product.Qty = NULL AND Product.ProductName != 'Ipad')
Cela devrait trouver toutes les lignes où vient d'être insérée avec le sql de copie en bloc. Je ne suis pas sûr de savoir comment prendre les résultats de cette puis faire une masse insérer avec eux à partir d'un SP.
Le seul problème que je peux voir avec cela est que si un utilisateur est en train de faire les enregistrements un à un temps et un cette instruction s'exécute en même temps, il pourrait essayer d'insérer une ligne de deux fois dans la "Revue de Produit Table".
Donc, dire que je suis comme un utilisateur à l'aide de la méthode manuelle et d'un autre utilisateur du fait de la masse de façon à peu près en même temps.
de façon manuelle.
1. L'utilisateur soumet des données
2. Linq to sql objet Produit est fait et rempli avec les données et les soumis.
3. cet objet contient maintenant le ProductId
4. Un autre linq to sql objet de l'examen des Produits de la table et est insérée(Id de Produit à partir de l'étape 3 est envoyé).
De masse.
1. L'utilisateur saisit des données à partir d'un utilisateur partage de données.
2. Tous les Produits des lignes de l'utilisateur partage sont de main.
3. SQL de copie en bloc à insérer sur le Produit des lignes qui se passe.
4. Ma SP sélectionne toutes les lignes qui n'existent que dans le tableau des Produits et répond à certaines autres conditions
5. Masse insert qui se passe avec ces lignes.
Donc ce qui arrive si l'étape 3(méthode manuelle) se déroule en même temps que l'étape 4(masse manière). Je pense qu'il serait d'essayer d'insérer la même ligne de deux fois provoquant une première contrainte execption.
OriginalL'auteur chobo2 | 2010-05-31
Vous devez vous connecter pour publier un commentaire.
Dans ce scénario, je voudrais utiliser
SqlBulkCopy
pour l'insérer dans un mise en scène table (c'est à dire celui qui ressemble à des données que je veux importer, mais ne fait pas partie des principales tables transactionnelles), puis à la DB pour unINSERT
/SELECT
pour déplacer les données dans la première vraie table.Maintenant, j'ai deux choix en fonction de la version du serveur, j'ai pu faire une deuxième
INSERT
/SELECT
à la deuxième table réelle, ou je pouvais utiliser leINSERT
/OUTPUT
clause de faire la seconde insertion , à l'aide de l'identité des lignes de la table.Par exemple:
ainsi, à l'exception de quelques scénarios, je voudrais utiliser une table intermédiaire de toute façon, pour que l': je ne suis pas d'impact sur le réel de la table lors de réseau IO temps, et b: pour obtenir tous les journaux de transactions.
Ok, je viens de recevoir mon édition. Allez, je pense que je pourrais avoir à faire une mise en scène tbl. Pas encore sûr. J'ai quelques questions sur votre chemin. Est -- ce Sont ces table factice créé sur le fichier ou utilisés uniquement pour les fins de l'exemple? 2ème comment voulez-vous faire un SQlbulkCopy dans une procédure stockée. 3ème comment faire pousser chose que le travail. Vous venez d'insérer l'ensemble de la table ou quelque chose? 4e comment à propos de connexions simultanées où peut-être un couple des utilisateurs? Il allait la mise en scène de la table, donc il y aurait besoin d'être une sorte de moyen de savoir lequel des données de les ajouter ensuite à supprimer?
J'aurais la mise en scène de la table il y a comme une table permanente. Vous pourriez avoir besoin d'un travail supplémentaire si vous avez besoin d'utilisation en parallèle, si. Re SP; je voudrais utiliser
SqlBulkCopy
appel du SP, mais vous pouvez l'utiliser en vrac-insert (pasSqlBulkCopy
) à partir de TSQL. 3: ne pas comprendre la question, mais vous écrivez le code dont vous avez besoin pour votre scénario... 4: dans ce cas, je voudrais ajouter une colonne à la table intermédiaire d'identifier les différentes demandes (toutes les lignes pour demander Un aurait la même valeur). Alternativement, appliquer (séparément) qu'un seul arrive à la fois (mais en parallèle est plus agréable).Alors, comment prendre mes résultats d'une instruction select, puis faire un insert avec eux? Je ne suis pas sûr de la façon de les stocker dans une sp et puis ne bulk insert.
OriginalL'auteur Marc Gravell
Si votre application le permet, vous pouvez ajouter une autre colonne vous permet de stocker un identificateur de l'instruction bulk insert (guid par exemple). Vous définissez cette id explicitement.
Puis après l'insertion en bloc, il vous suffit de sélectionner les lignes qui ont identifiant.
OriginalL'auteur Cosmin
J'ai eu le même problème, où j'ai dû récupérer les id des lignes insérées avec SqlBulkCopy.
Mon ID de la colonne est une colonne d'identité.
Solution:
J'ai inséré+ de 500 lignes avec la copie en bloc, puis sélectionnés avec la requête suivante:
Cette requête renvoie les lignes, j'ai juste inséré avec leur id. Dans mon cas, j'ai eu une autre colonne unique. J'ai donc sélectionné la colonne et l'id. Ensuite mises en correspondance avec un IDictionary comme suit:
Espère que cette aide.
OriginalL'auteur Vitaly Galinsky
Selon vos besoins et le degré de contrôle que vous avez des tables, vous pouvez envisager d'utiliser UNIQUEIDENTIFIERs (Guid) à la place de votre IDENTITÉ clés primaires. Cela déplace la gestion des clés à l'extérieur de la base de données et de vos applications. Il y a quelques sérieux compromis à cette approche, de sorte qu'il ne peut pas répondre à vos besoins. Mais il peut être utile d'examiner. Si vous êtes sûr que vous serez le pompage d'un grand nombre de données dans vos tables en vrac-insérer, il est souvent très pratique, pour avoir ces clés gérés dans votre modèle d'objet plutôt que votre application s'appuyant sur la base de données pour vous donner des données.
Vous pouvez également prendre une approche hybride à l'organisation de tables, comme proposé précédemment. Obtenir les données dans ces tables à l'aide de Guid pour les relations, et ensuite via des instructions SQL que vous pourriez obtenir l'entier des clés étrangères dans l'ordre et de la pompe de données dans vos tables de production.
OriginalL'auteur mattmc3
Je voudrais:
Tour sur l'identité insert sur la table
Saisir l'Id de la dernière ligne de la table
Boucle de
(int i = Id; i < datable.rows.count+1; i++)
Dans la boucle, affectez à la propriété Id de votre datable de
i+1
.Exécuter SQL d'insertion en bloc avec votre garder l'identité allumé.
Tour identité insérer back off
Je pense que c'est le moyen le plus sûr d'obtenir votre id sur un SQL d'insertion en bloc, car il permettra d'éviter incompatibles id qui pourrait causé par l'application d'être exécuté sur un autre thread.
OriginalL'auteur RiceRiceBaby
Avertissement: je suis le propriétaire du projet C# Des Opérations En Bloc
La bibliothèque surmonter SqlBulkCopy limitations et ajouter des fonctionnalités flexibles comme sortie d'identité insérée valeur.
Derrière le code, c'est exactement comme l'on a accepté la réponse, mais plus facile à utiliser.
OriginalL'auteur Jonathan Magnan
Mon approche est similaire à ce que RiceRiceBaby décrites, à l'exception d'une chose importante à ajouter, c'est que l'appel à extraire Max(Id) doit être une partie d'une opération, ainsi que l'appel à SqlBulkCopy.WriteToServer. Sinon, quelqu'un d'autre peut insérer lors de votre transaction, et ce serait faire de votre Identifiant est incorrect. Voici mon code:
OriginalL'auteur BeccaGirl