【问题标题】:Get Inserted value from Dapper从 Dapper 获取插入的值
【发布时间】:2015-09-09 13:17:25
【问题描述】:

我有 2 个使用 dapper 的查询。我想获取第一个插入查询的 ID,然后我需要该值到第二个查询,

我看到了一些重复,我试着做这个例子Click

但我对如何获取插入的 id 有一些疑问,

这里我已经粘贴了代码,

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();
        }
    }

【问题讨论】:

    标签: c# sql asp.net dapper


    【解决方案1】:

    在您的代码示例中,您现有的查询似乎没有使用 dapper。

    您所包含的 dapper 行无法正常工作,因为它是一个通用示例。您需要使用 dapper 或您自己的(可能是 ADO.NET)代码将第一个值插入数据库,然后从中检索 id。 因此,要使用 dapper 实现您的要求,您可以使用类似于以下内容(未测试):

    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();
        }
    

    还请注意,在您的示例中,您似乎没有使用参数化查询,这可能会使您容易受到 SQL 注入攻击,更多信息 herehere。使用可能更符合您现有代码的东西,您可以尝试以下几行(同样我还没有测试过):

        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();
        }
    

    【讨论】:

      猜你喜欢
      • 2016-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-21
      • 2022-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多