我有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();
}
}
答案 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注入攻击,更多信息here和here开放。使用可能更符合现有代码的东西,你可以尝试以下几行(我再次没有测试过):
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();
}