2016-06-23 2 views
1

Я изучаю перенос наших API на .Net Core 1.0.SqlClient Bulk Insert Без DataTable в .Net Core

К сожалению, datatable не поддерживается, и мы используем их для массового ввода данных в SQL Server.

Например:

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

Как я могу легко изменить это, чтобы позволить массовой вставки, без использования DataTables?

+0

Что вы в конечном итоге делает для решения этой проблемы? Я столкнулся с той же проблемой. – codeConcussion

+0

Попробуйте эту библиотеку: https://github.com/borisdj/EFCore.BulkExtensions – borisdj

+1

Просто перейдите на .Net Core 2.0 - 'Datatable' там поддерживается – Paval

ответ

1

DataTables были добавлены в .Net 2.0 Ядро - 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

Ваш пример кода не использует SqlBulkCopy («объемная вставка») прямо сейчас, поэтому я не уверен, что мы говорим об одних и тех же вещах здесь; но в любом случае it looks, как если бы .NET Core поддерживал WriteToServer(DbDataReader) (ссылка для ссылки на платформу .NET, но должна дать вам представление) перегрузки. Таким образом, вы можете использовать их вместо этого, обернув свой «источник данных» DbDataReader, т. Е. Выполнив его.

Есть несколько ответов, связанных с этим на SO уже. This может представлять особый интерес.

+0

Имеет ли SQLBulkCopy такую ​​же гибкость при добавлении списка элементов в базу данных? Например, мы используем 'INSERT INTO, используя SELECT с OUTPUT INTO' и т. Д. – Nicholas

+1

В качестве альтернативы пользовательской реализации DbDataReader можно использовать [RecordSetReader] (https://github.com/nreco/data/blob/master/src/NReco .Data/RecordSetReader.cs) из библиотеки [NReco.Data] (https://github.com/nreco/data) (поддерживает .NET Core). –