.Net Core 中没有 DataTable 的 SqlClient 批量插入

SqlClient Bulk Insert Without DataTable in .Net Core

我正在研究将我们的 API 移植到 .Net Core 1.0。

很遗憾,不支持 datatable,我们使用它们将数据批量插入 SQL 服务器。

例如:

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

如何在不使用数据表的情况下轻松更改它以允许批量插入?

您的示例代码现在不使用 SqlBulkCopy ("bulk insert"),所以我不确定我们在这里谈论的是同一件事;但无论如何 it looks as if .NET Core does support the WriteToServer(DbDataReader)(注意 link 用于完整的 .NET 框架,但应该给你一个想法)重载。所以你可以使用它们,通过用 DbDataReader 包装你的 "data source",即让它实现它。

SO 上已经有几个与此相关的答案。 This 可能是特别感兴趣的人之一。

数据表已添加到 .Net Core 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;
}