2016-06-23 11 views
1

Ich untersuche die Portierung unserer APIs zu .Net Core 1.0.SqlClient Masseneinfügung ohne DataTable in .Net Core

Leider wird datatable nicht unterstützt, und wir verwenden sie zum Masseneinfügen von Daten in SQL Server.

Zum Beispiel:

const string sqlText = @" 
       INSERT INTO MyTable (ID, Name) 
       SELECT ID, Name 
       FROM @MyList n 
       ";  
var dataTable = new DataTable("MyTable"); 
dataTable.Columns.Add("ID", typeof(int)); 
dataTable.Columns.Add("Name", typeof(string)); 

using (var connection = new SqlConnection(_tbsConnection)) 
{ 
    await connection.OpenAsync(); 
    try 
    { 
     var cmd = new SqlCommand(sqlText, connection, transaction); 
     var sqlFixture = cmd.Parameters.AddWithValue("@MyList", dataTable); 
     sqlFixture.SqlDbType = SqlDbType.Structured; 
     sqlFixture.TypeName = "InsertList"; 
     var rowsAffected = await cmd.ExecuteNonQueryAsync(); 
    } 
} 

Wie kann ich einfach diese Masseneinfügung zu ermöglichen, ändern, ohne Datentabellen zu verwenden?

+0

Was hast du das tun, am Ende zu lösen? Ich stehe vor demselben Problem. – codeConcussion

+0

Versuchen Sie diese Bibliothek: https://github.com/borisdj/EFCore.BulkExtensions – borisdj

+1

Einfach zu .Net Core 2.0 migrieren - 'Datatable' wird dort unterstützt – Paval

Antwort

1

Datentabellen wurden Net Core 2.0 hinzugefügt - Exploring DataTable and SqlDBAdapter in ASP.NET Core 2.0

public static DataTable ExecuteDataTable(SqlConnection conn, CommandType cmdType, string cmdText, SqlParameter[] cmdParms) 
{ 
    DataTable dt = new DataTable(); 
    // just doing this cause dr.load fails 
    dt.Columns.Add("CustomerID"); 
    dt.Columns.Add("CustomerName"); 
    SqlDataReader dr = ExecuteReader(conn, cmdType, cmdText, cmdParms); 
    // as of now dr.Load throws a big nasty exception saying its not supported. wip. 
    // dt.Load(dr); 
    while (dr.Read()) 
    { 
     dt.Rows.Add(dr[0], dr[1]); 
    } 
    return dt; 
} 

public static DataTable ExecuteDataTableSqlDA(SqlConnection conn, CommandType cmdType, string cmdText, SqlParameter[] cmdParms) 
{ 
    System.Data.DataTable dt = new DataTable(); 
    System.Data.SqlClient.SqlDataAdapter da = new SqlDataAdapter(cmdText, conn); 
    da.Fill(dt); 
    return dt; 
} 
1

Ihr Beispiel-Code verwendet SqlBulkCopy ("Bulk-Insert") gerade nicht, also bin ich mir nicht sicher, ob wir hier über die gleichen Dinge sprechen; aber wie auch immer it looks als ob .NET Core unterstützt die WriteToServer(DbDataReader) (beachten Sie Link ist für die vollständige .NET-Framework, aber sollte Ihnen eine Idee) Überladungen. Sie können diese stattdessen verwenden, indem Sie Ihre "Datenquelle" mit einer DbDataReader umhüllen, d. H. Sie müssen es implementieren.

Es gibt ein paar Antworten zu diesem Thema auf SO bereits. This könnte von besonderem Interesse sein.

+0

Hat SQLBulkCopy die gleiche Flexibilität beim Hinzufügen einer Liste von Elementen zur Datenbank? Zum Beispiel verwenden wir 'INSERT INTO mit SELECT mit OUTPUT INTO' usw. – Nicholas

+1

Als Alternative zur benutzerdefinierten DbDataReader-Implementierung ist es möglich, [RecordSetReader] (https://github.com/nreco/data/blob/master/src/NReco) zu verwenden .Data/RecordSetReader.cs) von der [NRecoData] (https://github.com/nreco/data) Bibliothek (unterstützt .NET Core). –

Verwandte Themen