J'ai un lot de lignes qui doivent être insérées dans une seule transaction, la première ligne est un en-tête et toutes les lignes suivantes doivent faire référence au premier.Insérer des lignes dans la transaction avec FK à la première ligne créée
Voici comment je tente d'insérer la première ligne:
using (var connection = new SqlConnection(_connectionString))
{
connection.Open();
var transaction = connection.BeginTransaction();
try
{
// create the record header
using (var createRecordCommand = connection.CreateCommand())
{
createRecordCommand.CommandText =
"DECLARE @RecordId INT;" +
$"INSERT INTO ..." +
"SET @RecordId = scope_identity();";
createRecordCommand.Transaction = transaction;
createRecordCommand.ExecuteNonQuery();
Je me bats pour faire référence à RECORDID dans les déclarations ultérieures, il semble penser n'est pas déclaré la @RecordId variable dans l'extrait ci-dessous . 'Doit déclarer la variable scalaire "@RecordId".'
using (var createAttributeCommand = connection.CreateCommand())
{
createAttributeCommand.Transaction = transaction;
createAttributeCommand.CommandText =
$"INSERT INTO ... (RecordId,...) VALUES (@RecordId,...)";
extraire également la variable @RecordId comme paramètre se révèle difficile, il n'aime pas ça quand j'utiliser la ligne ci-dessous conjointement avec DECLARE @RecordId INT;
createRecordCommand.Parameters.Add(new SqlParameter("@RecordId", SqlDbType.Int) { Direction = ParameterDirection.Output });
Pourquoi ne pas mettre votre logique dans une procédure stockée et puis juste appeler la procédure à partir de C#? –
J'ai rasé la complexité de la question hors de la question, ce que nous essayons de réaliser est trop complexe pour un proc stocké malheureusement. –
Ummm quoi? Trop complexe pour une procédure stockée? Effectuez l'insertion en tant que procédure stockée et utilisez un paramètre OUTPUT pour renvoyer l'identité. –