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

时间:2016-06-23 04:37:19

标签: c# .net datatable asp.net-core .net-core

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

不幸的是,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();
    }
}

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

2 个答案:

答案 0 :(得分:1)

您的示例代码现在不使用SqlBulkCopy(“批量插入”),所以我不确定我们在这里谈论的是同样的事情;但无论如何it looks好像.NET Core支持WriteToServer(DbDataReader)(注意链接是完整的.NET框架,但应该给你一个想法)重载。因此,您可以使用DbDataReader包装“数据源”来使用它们,即让它实现它。

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

答案 1 :(得分:1)

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