2015-09-09 3 views
1

У меня есть 2 запросов с dapper.I хотят получить идентификатор первого вставленного запроса, а затем мне нужно это значение второго запроса,Получить вставленное значение от Dapper

Я видел некоторые дубликаты, и я попытался сделать этот пример Click

Но у меня есть некоторые сомнения в том, как получить вставленный идентификатор,

Здесь я должен вставить код,

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

в программном коде EXA mple не кажется, что ваши существующие запросы используют dapper.

Линия dapper, которую вы включили, не будет работать правильно, так как это общий пример. Вам нужно будет вставить первое значение в базу данных, используя либо dapper, либо свой собственный (возможно, ADO.NET) код, а затем извлечь идентификатор из этого. Таким образом, чтобы добиться того, что вы требуете с помощью щеголеватый, вы можете использовать что-то похожее на следующее (не проверено):

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(); 
    } 
Смежные вопросы