2014-10-07 10 views
13

mam procedurę, która trwa w parametr wycenione tabela, wraz z innymi:Korzystanie Dapper.TVP TableValueParameter z innymi parametrami

CREATE PROCEDURE [dbo].[Update_Records] 
    @currentYear INT, 
    @country INT, 
    @records Record_Table_Type READONLY 
AS 

i staram się nazwać z Dapper.TVP.

Oto kod mam tak daleko:

 var recordsParameter = new List<SqlDataRecord>(); 

     // This metadata matches 'Record_Table_Type' in the Database 
     var recordsMetaData = new[] 
     { 
      new SqlMetaData("OriginalValue", SqlDbType.Decimal, 19, 4), 
      new SqlMetaData("NewValue", SqlDbType.Decimal, 19, 4), 
      new SqlMetaData("NewPercent", SqlDbType.Decimal, 7, 2), 
     }; 

     foreach (var r in records) 
     { 
      var record = new SqlDataRecord(recordsMetaData); 
      record.SetDecimal(0, r.OriginalValue); 
      record.SetDecimal(1, r.NewValue); 
      record.SetDecimal(2, r.NewPercent); 
      recordsParameter.Add(record); 
     } 

     var spParams = new DynamicParameters(new 
     { 
      currentYear = filter.currentYear, 
      country = filter.country, 
     }); 

     var recordsParam = new TableValueParameter("@records", "Record_Table_Type", recordsParameter); 

     using (var connection = ConnectionFactory.GetConnection()) 
     { 
      connection.Execute("Update_Records", ???, commandType: CommandType.StoredProcedure); 
     } 

Mój problem jest jak mam przekazać oba zestawy parametrów do procedury w zaproszeniu do Wytworny Execute()?

Próbowałem:

var spParams = new DynamicParameters(new 
{ 
    currentYear = filter.currentYear, 
    country = filter.country, 
    records = new TableValueParameter("@records", "Record_Table_Type", recordsParameter); 
}); 

connection.Execute("Update_Records", spParams, commandType: CommandType.StoredProcedure); 

i

connection.Execute("Update_Records", new Object[] { spParams, recordsParam }, commandType: CommandType.StoredProcedure); 

Zarówno wywołać procedurę, ale przechodzą pusty parametr tabeli (SELECT COUNT(*) FROM @records powraca 0)

ja nie mogę znaleźć wszelka aktualna dokumentacja lub źródło dla Dapper.TVP, więc cała sprawa jest bardzo zagmatwana, a drugi parametr do .Execute() to tylko dynamic s o to znowu nie mówi mi, co mogę i nie mogę do niego przejść.

Wszelkie pomysły?

+0

Powiązane: http://stackoverflow.com/a/24633764/23354 –

Odpowiedz

10

Jestem na telefon i może być nieporozumienia pytanie, ale to powinno być tak:

DataTable records = ... 
connection.Execute("Update_Records", 
    new { 
     currentYear = filter.currentYear, 
     country = filter.country, 
     records 
    }, 
    commandType: CommandType.StoredProcedure 
); 
+0

Tak, właśnie to zrobiłem. Moje początkowe wyszukiwania spowodowały pojawienie się pakietu Dapper.TVP NuGet, który nie jest już potrzebny (ani utrzymywany). Dzięki! – CodingWithSpike

+0

@CodingWithSpike rzeczywiście, nie powinno być już potrzebne - dapper obsługuje wewnętrznie TVP; co do utrzymywanych: nie wiem - to nie moje; p –

5

Na podstawie odpowiedzi z Markiem Gravell tutaj: Does Dapper support SQL 2008 Table-Valued Parameters?

zmieniłem kod, aby nie używać Dapper.TVP i zamiast po prostu użyć DataTable więc kod jest teraz:

 var recordsTable = new DataTable(); 
     recordsTable.Columns.Add("NewValue", typeof(Decimal)); 
     foreach (var netRevenue in records) 
     { 
      var row = recordsTable.NewRow(); 
      row[0] = netRevenue.NewValue; 
      recordsTable.Rows.Add(row); 
     } 
     recordsTable.EndLoadData(); 

     var spParams = new DynamicParameters(new 
     { 
      currentYear = filter.currentYear, 
      country = filter.country, 
      records = recordsTable.AsTableValuedParameter("Record_Table_Type") 
     }); 

     using (var connection = ConnectionFactory.GetConnection()) 
     { 
      connection.Execute("Update_Records", spParams, commandType: CommandType.StoredProcedure); 
     } 

I Prace.

+0

Nie powinieneś tak naprawdę potrzebować As ... tutaj: ponieważ sproc definiuje typ zdefiniowany przez użytkownika, powinien działać bez określania go. –

+0

Robisz, jeśli używasz dynamicznego SQL. –

2

Jaki byłby alternatywą dla DataTable typu, na wszelki wypadek chcę go używać w ASP.NET core jak obecnie nie ma wsparcia dla DataTable ...

+0

Czy to wymyśliłeś? Czy mógłbyś podać link do odpowiedzi, jeśli tak zrobiłeś? – Jon49

+0

Musisz użyć SqlDataRecords https://github.com/StackExchange/Dapper/blob/61e965eed900355e0dbd27771d6469248d798293/Dapper.Tests/Tests.Parameters.cs#L167 – Jon49