Cómo guardar toda la DataTable usando dapper?

.net dapper

Pregunta

Tengo un objeto de tabla de datos lleno de datos y quiero guardarlo en SQL-DB (no quiero ejecutar un bucle foreach para hacer la inserción), código de esta manera:

var dt = new DataTable();
//
// ... data loading to table dt
//

string sql = @"
INSERT INTO TB_Book (
  BookID,
  BookName
) SELECT
  BookID,
  BookName
FROM 
@DataTable";

conn.execute(sql, new { DataTable = dt.AsTableValuedParameter("DataTable") });

Cuando la página se ejecuta, arroja la siguiente excepción:

Columna, parámetro o variable @DataTable. : No se puede encontrar el tipo de datos DataTable

¿Cómo puedo mejorar mi código para que esto funcione?

Respuesta aceptada

Todavía no he trabajado con el parámetro AsTableValuedParameter, pero utilizo las pruebas unitarias escritas en el repositorio de GIT dappers para enseñarme cualquier detalle. Cuando fui allí para investigar su pregunta, localicé lo siguiente:

https://github.com/StackExchange/dapper-dot-net/blob/61e965eed900355e0dbd27771d6469248d798293/Dapper.Tests/Tests.Parameters.cs#L251

Parece que deseará utilizar AsTableValuedParameter () sin el tipo de "DataTable" proporcionado.

Este es el ejemplo de StackExchange:

[Fact]
public void DataTableParameters()
{
    try { connection.Execute("drop proc #DataTableParameters"); }
    catch { }
    try { connection.Execute("drop table #DataTableParameters"); }
    catch { }
    try { connection.Execute("drop type MyTVPType"); }
    catch { }
    connection.Execute("create type MyTVPType as table (id int)");
    connection.Execute("create proc #DataTableParameters @ids MyTVPType readonly as select count(1) from @ids");

    var table = new DataTable { Columns = { { "id", typeof(int) } }, Rows = { { 1 }, { 2 }, { 3 } } };

    int count = connection.Query<int>("#DataTableParameters", new { ids = table.AsTableValuedParameter() }, commandType: CommandType.StoredProcedure).First();
    count.IsEqualTo(3);

    count = connection.Query<int>("select count(1) from @ids", new { ids = table.AsTableValuedParameter("MyTVPType") }).First();
    count.IsEqualTo(3);

    try
    {
        connection.Query<int>("select count(1) from @ids", new { ids = table.AsTableValuedParameter() }).First();
        throw new InvalidOperationException();
    }
    catch (Exception ex)
    {
        ex.Message.Equals("The table type parameter 'ids' must have a valid type name.");
    }
}


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué