2016-06-23 19 views
1

私のAPIを.Net Core 1.0に移植する方法を検討しています。.NET FrameworkのDataTableを使用しないSqlClientの一括挿入

残念ながら、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(); 
    } 
} 

にはどうすれば簡単にDataTableのを使用せずに、一括挿入を可能にし、これを変更することができますか?

+0

あなたがこれに対処するために何をして終わるのですか?私は同じ問題に直面しています。 – codeConcussion

+0

このライブラリを試してください:https://github.com/borisdj/EFCore.BulkExtensions – borisdj

+1

.Net Core 2.0に移行するだけです。そこには「Datatable」があります – Paval

答えて

1

のDataTableは、.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コアがWriteToServer(DbDataReader)をサポートしているかのように見えます(リンクは完全な.NETフレームワーク用ですが、アイデアを与える必要があります)。だから代わりに、あなたの "データソース"をDbDataReaderでラップする、つまりそれを実装することで、それらを使うことができます。

これに関連して、すでに2つの回答があります。 Thisは特に興味深いものの1つであるかもしれません。

+0

データベースにアイテムのリストを追加するときにSQLBulkCopyにも同じ柔軟性がありますか?たとえば、「INSERT INTO with 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をサポート)からダウンロードします。 –

関連する問題