C# 如何使用 List.AddRange 更有效地插入大量数据

C# How to insert bulk of data using List.AddRange more efficiently

我正在尝试使用 C# 代码直接将数据从第三方 (Sage) 的 Rest API 插入到 Azure SQL。

当我尝试添加大约 30,000 行数据时,我在第 66 行出现底部错误

resultList.AddRange(result.Data);

我只尝试了三列数据,无法添加更多列。

目前,我在 Azure SQL 数据库中使用 'basic' 层。

我不确定我可以对 C# 代码进行哪些改进以使其更高效(例如使用更好的方式添加列表)。

或者我应该只升级 Azure SQL 数据库中哪个层更好 DTU

或者我不应该将 JSON 隐藏(序列化)到 Azure SQL,而是首先直接在 Cosmos DB 中以 JSON 格式插入,然后再移动到 Azure SQL ?

底部是错误信息:

System.Data.SqlClient.SqlException
HResult=0x80131904
Message=Timeout expired.  The timeout period elapsed prior to completion of the operation or 
the server is not responding.
Source=Core .Net SqlClient Data Provider
StackTrace:
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean 
breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, 
Boolean callerHasConnectionLock, Boolean asyncClose)
at System.Data.SqlClient.TdsParserStateObject.ThrowExceptionAndWarning(Boolean 
callerHasConnectionLock, Boolean asyncClose)
at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, 
UInt32 error)
at System.Data.SqlClient.TdsParserStateObject.ReadSniSyncOverAsync()
at System.Data.SqlClient.TdsParserStateObject.TryReadNetworkPacket()
at System.Data.SqlClient.TdsParserStateObject.TryPrepareBuffer()
at System.Data.SqlClient.TdsParserStateObject.TryReadByte(Byte& value)
at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, 
SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject 
stateObj, Boolean& dataReady)
at System.Data.SqlClient.SqlBulkCopy.WriteToServer(DataTable table)
at Sage0413.Program.Main(String[] args) in C:\Users\source\repos\Sage\Main.cs:line 66

这是 C# 代码的一部分,其中包含 List.AddRange:

List<dynamic> resultList = new List<dynamic>();
do
{
    query.Offset = offset;
    query.PageSize = pagesize;

    Task<OnlineResponse> task = client.Execute(query);
    OnlineResponse response = task.Result;
    Result result = response.Results[0];

    offset += pagesize;
    resultList.AddRange(result.Data);

} while (offset < 30000);
resultJsonString = JsonConvert.SerializeObject(resultList);
return resultJsonString;      

这是 C# 代码的一部分,其中包含 SqlBulkCopy:

foreach (var record in data)
{
table.Rows.Add(new object[] { record.Detail.RecordNo, record.Detail.BatchKey, 
record.Detail.WhenModified });
}

using (var conn = new SqlConnection(connString))
using (var bulk = new SqlBulkCopy(conn))
{
    bulk.DestinationTableName = "tblSage";
    conn.Open();
    bulk.WriteToServer(table);
} 

您需要调整超时值以允许比默认值更长的时间。

bulk.BulkCopyTimeout = 60; // seconds

参考: