使用VS 2013 ASP.NET MVC 5 Web项目和单独的Azure托管SQL Server数据库进行开发。
底部是我在Visual Studio 2013中的所有错误信息。我已经缩小了问题的范围,并在没有解决方案的情况下找到了Microsoft问题描述的链接。我正在使用Database First和Entity Framework 6进行开发.ASP.NET 4 MVC&剃刀。我连接到SQL Azure数据库 - 我认为这已经是我已经检查了Azure网站等日志
我已将分隔的文本文件(已上传到APP_DATA)加载到DataTable中,然后使用SQL-Bulk Copy将内容转储到Azure数据库中。只要我的文件只包含几百条记录,所有作品都可以100%罚款。但是我需要插入大约200,000行的20MB文件。当我尝试大文件时,我在ASP.NET执行批量复制时得到一个错误。无论我为批量大小等设置什么,它每次都会在4000行标记附近徘徊。我已经筋疲力尽了所有选项,在我的结果中,我甚至尝试将Azure数据库从免费网络扩展到商业。我也尝试扩大网站规模。这是代码:
public void BatchBulkCopy(DataTable dataTable, string DestinationTbl, int batchSize,int identity)
{
try {
// Set the timeout.
System.Diagnostics.Debug.WriteLine("Start SQL Bulk Copy");
using (SqlBulkCopy sbc = new SqlBulkCopy("Server=tcp:eumtj4loxy.database.windows.net,1433;Database=AscWaterDB;User ID=HIDDEN@HIDDEN;Password=XXXXXXX;Trusted_Connection=False;Encrypt=True;Connection Timeout=900;", SqlBulkCopyOptions.TableLock))
{
sbc.DestinationTableName = DestinationTbl;
sbc.BulkCopyTimeout = 0;
// Number of records to be processed in one go
sbc.BatchSize = 1000;
// Add your column mappings here
sbc.ColumnMappings.Add("D2001_SPID", "SupplyPointId");
sbc.ColumnMappings.Add("D2002_ServiceCategory", "D2002_ServiceCategory");
sbc.ColumnMappings.Add("D2025_NotifyDisconnection/Reconnection", "D2025_NotifyDisconnectionReconnection");
sbc.ColumnMappings.Add("WaterBatchId", "WaterBatchId");
sbc.ColumnMappings.Add("D2003_Schedule3", "D2003_Schedule3");
sbc.ColumnMappings.Add("D2004_ExemptCustomerFlag", "D2004_ExemptCustomerFlag");
sbc.ColumnMappings.Add("D2005_CustomerClassification", "D2005_CustomerClassification");
sbc.ColumnMappings.Add("D2006_29e", "D2006_29e");
sbc.ColumnMappings.Add("D2007_LargeVolAgreement", "D2007_LargeVolAgreement");
sbc.ColumnMappings.Add("D2008_SICCode", "D2008_SICCode");
sbc.ColumnMappings.Add("D2011_RateableValue", "D2011_RateableValue");
sbc.ColumnMappings.Add("D2015_SPIDVacant", "D2015_SPIDVacant");
sbc.ColumnMappings.Add("D2018_TroughsDrinkingBowls", "D2018_TroughsDrinkingBowls");
sbc.ColumnMappings.Add("D2019_WaterServicesToCaravans", "D2019_WaterServicesToCaravans");
sbc.ColumnMappings.Add("D2020_OutsideTaps", "D2020_OutsideTaps");
sbc.ColumnMappings.Add("D2022_TransitionalArrangements", "D2022_TransitionalArrangements");
sbc.ColumnMappings.Add("D2024_Unmeasurable", "D2024_Unmeasurable");
sbc.ColumnMappings.Add("D2014_FarmCroft", "D2014_FarmCroft");
// Finally write to server
System.Diagnostics.Debug.WriteLine("Write Bulk Copy to Server " + DateTime.Now.ToString());
sbc.WriteToServer(dataTable); // Fails here when I upload a 20MB CSV with 190,000 rows
sbc.Close();
}
// Ignore this I don't get to this code unless loading a file thats only got a few records
WaterBatch obj = GetWaterBatch(identity); // Now we can get the WaterBatch
obj.StopDateTime = DateTime.Now;
Edit(obj);
Save();
System.Diagnostics.Debug.WriteLine("Finished " + DateTime.Now.ToString());
}
catch (Exception ex)
{
Exception ex2 = ex;
while (ex2.InnerException != null)
{
ex2 = ex2.InnerException;
}
Console.WriteLine(ex.InnerException);
throw;
}
}
我的$ Exception说:
$exception {"A transport-level error has occurred when receiving results from the server. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.)"} System.Exception {System.Data.SqlClient.SqlException}
我的InnerException是,如果我进入内部然后内部异常等与Hresult的相同的消息-2146232060然后-2147467259:
InnerException {"An existing connection was forcibly closed by the remote host"} System.Exception {System.ComponentModel.Win32Exception}
更新信息:
Microsoft的错误说明(如下)。我得到一个错误号40197.然后微软说要找%d代码 - 我得到4815.问题是现在,我在哪里可以从这里进入40197,%d为4815:
我从此链接获得了有关我的错误的以下信息:http://msdn.microsoft.com/en-us/library/windowsazure/ff394106.aspx
40197 17 该服务在处理您的请求时遇到错误。请再试一次。错误代码%d。 当服务因软件或硬件升级,硬件故障或任何其他故障转移问题而关闭时,您将收到此错误。嵌入在错误40197的消息中的错误代码(%d)提供有关发生的故障或故障转移类型的其他信息。嵌入在错误40197的消息中的错误代码的一些示例是40020,40143,40166和40540。 重新连接到SQL数据库服务器将自动将您连接到数据库的正常副本。您的应用程序必须捕获错误40197,在消息中记录嵌入式错误代码(%d)以进行故障排除,并尝试重新连接到SQL数据库,直到资源可用,并再次建立连接。
答案 0 :(得分:2)
我在批量插入过程中遇到了完全相同的错误。就我而言,这是一个溢出的varchar
列。我只需要增加字符限制,问题就解决了。