Valeur de retour de la commande SQL Server Insert en utilisant c#

En utilisant C # dans Visual Studio, j'insère une ligne dans une table comme ceci:

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 renverrait la colonne foo_id de la ligne nouvellement insérée.

En Outre, 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 est pour lire des données, le second est pour manipuler des données. Lors de l'insertion d'une ligne avec un déclaration de retour, je suis à la fois en train de manipuler et de lire des données, donc je ne sais pas quoi utiliser. Peut-être qu'il y a quelque chose de complètement différent que je devrais utiliser pour cela?

22
demandé sur marc_s 2012-02-17 01:43:10

3 réponses

SCOPE_IDENTITY renvoie la dernière valeur d'identité insérée dans une colonne d'identité de la même portée. Une portée 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 sont dans la même procédure, fonction ou lot stocké.

Vous pouvez utiliser SqlCommand.ExecuteScalar pour exécuter la commande insert et récupérer le nouvel ID dans une 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
répondu Tim Schmelter 2012-02-16 22:06:57

, Essayez ceci:

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

OUTPUT {[7] } peut renvoyer un jeu de résultats (entre autres), voir: OUTPUT Clause (Transact-SQL) . En outre, si vous insérez plusieurs valeurs (INSERT SELECT), cette méthode retournera une ligne par ligne insérée, où les autres méthodes ne retourneront que des informations 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')

Sortie:

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

(1 row(s) affected)
13
répondu KM. 2012-02-16 21:47:18

Je pense que vous pouvez utiliser @ @ IDENTITY pour cela, mais je pense qu'il y a des règles/restrictions spéciales autour de cela?

using (var con = new SqlConnection("connection string"))
{
    con.Open();
    string query = "INSERT INTO table (column) VALUES (@value)";

    var command = new SqlCommand(query, con);
    command.Parameters.Add("@value", value);
    command.ExecuteNonQuery();

    command.Parameters.Clear();
    command.CommandText = "SELECT @@IDENTITY";

    int identity = Convert.ToInt32(command.ExecuteScalar());
}
-1
répondu Jesse 2012-02-16 21:54:52