从Dapper获取插入的值

时间:2015-09-09 13:17:25

标签: c# sql asp.net dapper

我有4个查询与dapper.I想要获取第一个插入查询的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();
        }
    }

1 个答案:

答案 0 :(得分:1)

在您的代码示例中,您的现有查询似乎没有使用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();
    }