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
参考:
我正在尝试使用 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
参考: