我正在研究将我们的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();
}
}
如何在不使用数据表的情况下轻松更改此选项以允许批量插入?
答案 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;
}