SQLBulkCopy错误40197,%d代码为4815(连接强制关闭)

时间:2013-11-18 05:03:40

标签: sql-server asp.net-mvc azure azure-sql-database sqlbulkcopy

使用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数据库,直到资源可用,并再次建立连接。

1 个答案:

答案 0 :(得分:2)

我在批量插入过程中遇到了完全相同的错误。就我而言,这是一个溢出的varchar列。我只需要增加字符限制,问题就解决了。