web-dev-qa-db-fra.com

Renvoyer la valeur de la commande SQL Server Insert en utilisant c #

En utilisant C # dans Visual Studio, j'insère une ligne dans un tableau comme celui-ci:

INSERT INTO foo (column_name)
VALUES ('bar')

Je veux faire quelque chose comme ça, mais je ne connais pas la syntaxe correcte:

INSERT INTO foo (column_name)
VALUES ('bar')
RETURNING foo_id

Cela retournerait le foo_id colonne de la ligne nouvellement insérée.

De plus, même si je trouve la syntaxe correcte pour cela, j'ai un autre problème: j'ai SqlDataReader et SqlDataAdapter à ma disposition. Pour autant que je sache, le premier sert à la lecture des données, le second à la manipulation des données. Lorsque j'insère une ligne avec une instruction de retour, je manipule et lis des données, donc je ne sais pas quoi utiliser. Peut-être que je devrais utiliser quelque chose de complètement différent pour cela?

23
Neko

SCOPE_IDENTITY renvoie la dernière valeur d'identité insérée dans une colonne d'identité dans la même étendue. Une étendue est un module: une procédure stockée, un déclencheur, une fonction ou un lot. Par conséquent, deux instructions sont dans la même portée si elles se trouvent dans la même procédure stockée, fonction ou lot.

Vous pouvez utiliser SqlCommand.ExecuteScalar pour exécuter la commande d'insertion et récupérer le nouvel ID dans une seule requête.

using (var con = new SqlConnection(ConnectionString)) {
    int newID;
    var cmd = "INSERT INTO foo (column_name)VALUES (@Value);SELECT CAST(scope_identity() AS int)";
    using (var insertCommand = new SqlCommand(cmd, con)) {
        insertCommand.Parameters.AddWithValue("@Value", "bar");
        con.Open();
        newID = (int)insertCommand.ExecuteScalar();
    }
}
63
Tim Schmelter

essaye ça:

INSERT INTO foo (column_name)
OUTPUT INSERTED.column_name,column_name,...
VALUES ('bar')

La sortie [~ # ~] [~ # ~] peut renvoyer un jeu de résultats (entre autres), voir: Clause OUTPUT (Transact -SQL) . De plus, si vous insérez plusieurs valeurs (INSERT SELECT), cette méthode renvoie une ligne par ligne insérée, où les autres méthodes ne renvoient des informations que sur la dernière ligne.

exemple de travail:

declare @YourTable table (YourID int identity(1,1), YourCol1 varchar(5))

INSERT INTO @YourTable (YourCol1)
OUTPUT INSERTED.YourID
VALUES ('Bar')

PRODUCTION:

YourID
-----------
1

(1 row(s) affected)
13
KM.