Obtenir une valeur insérée à partir de Dapper

asp.net c# dapper sql

Question

J'ai 2 requêtes avec dapper.Je veux obtenir l'id de la première requête insérée et puis j'ai besoin de cette valeur à la deuxième requête,

J'ai vu des doublons et j'ai essayé de faire cet exemple Cliquez

Mais j'ai des doutes sur la façon d'obtenir l'ID inséré,

Ici, j'ai collé le code,

public string InsertNewsAndDetails(News n)
    {
        DataAccess dbconn = DataAccess.Create("Connection");
        try
        {
            int value;

            using (var transction = dbconn.BeginTransaction())
            {

                StringBuilder sqlBuilder = new StringBuilder();

                sqlBuilder.Append(@"INSERT INTO News_Tbl(NewsCode,NewsStatus,NewsDate)");
                sqlBuilder.Append("VALUES ('" + n.NewsCode + "','" + n.NewsStatus + "','" + n.NewsDate + "') SELECT CAST(SCOPE_IDENTITY() as int)");

                // in the referred example,it shows below line to get id.But i have no idea how to get it ??
               //var id = connection.Query<int>(sql, new { Stuff = mystuff}).Single();


                if (id != null)
                {
                    sqlBuilder.Append("INSERT INTO NewsDtl_Tbl(NewsId,DetailName,Details)");
                    sqlBuilder.Append("VALUES (" + id + ",'" + n.DetailName + "','" + n.Details + "')");
                }
                value = transction.Execute(sqlBuilder.ToString());
                transction.Complete();


            }

            return "";
        }
        catch (Exception Ex)
        {

        }
        finally
        {
            db.Dispose();
        }
    }

Réponse populaire

Dans votre exemple de code, il ne semble pas que vos requêtes existantes utilisent dapper.

La ligne que vous avez incluse ne fonctionnera pas correctement car il s'agit d'un exemple générique. Vous devrez insérer la première valeur dans la base de données, soit en utilisant dapper ou votre propre code (éventuellement ADO.NET), puis en extraire l'ID. Donc, pour obtenir ce dont vous avez besoin en utilisant dapper, vous pouvez utiliser quelque chose semblable à ce qui suit (non testé):

using (var transction = dbconn.BeginTransaction())
    {
        var sql = @"INSERT INTO News_Tbl(NewsCode, NewsStatus, NewsDate) VALUES (@NewsCode, @NewsStatus, @NewsDate); SELECT CAST(SCOPE_IDENTITY() as int";
        var lastInsertedId = dbconn.Query<int>(sql, new {NewsCode = n.NewsCode, NewsStatus = n.NewsStatus, NewsDate = n.NewsDate }, transaction);


        var secondSql = @"INSERT INTO NewsDtl_Tbl(NewsId, DetailName, Details) VALUES (@Id, @DetailName, @Details)";
        var secondQuery = dbconn.Execute(secondSql, new {Id = lastInsertedId, DetailName = n.DetailName, Details = n.Details}, transaction);

        transction.Complete();
    }

Notez également que dans votre exemple, vous ne semblez pas utiliser de requêtes paramétrées, ce qui pourrait vous laisser ouvert aux attaques par injection SQL, plus d'informations ici et ici . En utilisant quelque chose qui est peut-être plus conforme à votre code existant, vous pouvez essayer quelque chose comme suit (encore une fois, je n'ai pas testé ceci):

    StringBuilder sqlBuilder = new StringBuilder();

    sqlBuilder.Append(@"INSERT INTO News_Tbl(NewsCode, NewsStatus, NewsDate)");
    sqlBuilder.Append("VALUES (@NewsCode, @NewsStatus, @NewsDate); SELECT CAST(SCOPE_IDENTITY() as int)");

    var firstCommand = new SqlCommand(sqlBuilder, dbConn);
    firstCommand.Parameters.AddWithValue("@NewsCode", n.NewsCode);
    firstCommand.Parameters.AddWithValue("@NewsStatus", n.NewsStatus);
    firstCommand.Parameters.AddWithValue("@NewsDate", n.NewsDate);

    // add the first query here, an example may be:
    var lastModifiedId = command.ExecuteScalar(sqlBuilder);

    if (id != null)
    {
        sqlBuilder.Length = 0;
        sqlBuilder.Append("INSERT INTO NewsDtl_Tbl(NewsId,DetailName,Details) ");
        sqlBuilder.Append("VALUES (@lastModifiedId, @DetailName, @Details)");

        var secondCommand = new SqlCommand(sqlBuilder, dbConn);
        secondCommand.Parameters.AddWithValue("@lastModifiedId", lastModifiedId);
        secondCommand.Parameters.AddWithValue("@DetailName", n.DetailName);
        secondCommand.Parameters.AddWithValue("@Details", n.Details);
        secondCommand.ExecuteNonQuery();
    }



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi