2014-10-07 7 views
13

Ich habe ein Verfahren, das in einem Tabellenwertparameter nimmt, zusammen mit anderen:Mit Dapper.TVP TableValueParameter mit anderen Parametern

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

und ich versuche, dies mit Dapper.TVP zu nennen.

Hier ist der Code, den ich bisher habe:

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

Mein Problem ist, wie gehe ich beiden Sätze von Parametern der Prozedur in dem Aufruf Execute() adretten?

Ich habe versucht:

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

und

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

Sowohl die Prozedur aufrufen, sondern eine leere Tabelle Parameter übergeben (SELECT COUNT(*) FROM @records liefert 0)

ich nicht zu finden scheinen, jede tatsächliche Dokumentation oder Quelle für Dapper.TVP, so dass die ganze Sache sehr verwirrend ist, und der zweite Parameter auf .Execute() ist nur dynamic s o das sagt mir wiederum nicht, was ich kann und was nicht.

Irgendwelche Ideen?

+0

Related: http://StackOverflow.com/A/24633764/23354 –

Antwort

10

Ich bin auf mobilen und kann die Frage sein Missverständnis, aber dies sollte nur sein:

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

Yep, das ist, was ich am Ende tun. Meine anfängliche Suche drehte das Dapper.TVP NuGet Paket auf, die nicht zu sein scheinen erforderlich (oder beibehalten?) Nicht mehr. Vielen Dank! – CodingWithSpike

+0

@CodingWithSpike in der Tat, soll es nicht mehr benötigt werden - adrett Griffe TVPs intern; wie für beibehalten: Ich weiß es nicht - es ist nicht mein; p –

5

Basierend auf einer Antwort von Mark Gravell hier: Does Dapper support SQL 2008 Table-Valued Parameters?

ich meinen Code nicht mehr Dapper.TVP geändert verwenden und stattdessen nur ein DataTable verwenden, so ist der Code jetzt:

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

Und das funktioniert.

+0

Sie sollten eigentlich nicht die As ... hier: weil die Sproc definiert der benutzerdefinierte Typ, sollte es funktionieren, ohne es zu spezifizieren. –

+0

Sie tun, wenn Sie dynamisches SQL verwenden. –

2

Was wäre die Alternative zu dem Datatable-Typ, falls ich es in asp.net verwenden möchten Kern, da es im Moment keine Unterstützung für DataTable gibt ...

+0

Hast du dies herauszufinden? Könnten Sie einen Link zu der Antwort bereitstellen, wenn Sie das getan haben? – Jon49

+0

Sie müssen verwenden SqlDataRecords https://github.com/StackExchange/Dapper/blob/61e965eed900355e0dbd27771d6469248d798293/Dapper.Tests/Tests.Parameters.cs#L167 – Jon49