SqlBulkCopy错误(已经有一个打开的DataReader ...)

时间:2019-07-25 21:03:27

标签: c# sqlbulkcopy

我正在尝试从一个sql表到另一个sql表进行精确复制。两个表都位于同一数据库中。我正在尝试使用SqlBulkCopy,但收到“与此命令相关联的打开的DataReader,必须先关闭它”。错误。

我发现了许多类似的问题,并尝试了其中包含的解决方案,但均未成功。我对此很陌生,因此,对此(或下面的任何代码)的任何帮助都将受到赞赏。

SqlCommand readLocal = new SqlCommand("Select CompanyNumber,CompanyName,AccessNumber,TruckName,TransferStartTime,TransferEndTime,TransferVolume FROM TransfersNew", conLocal);

try
{
    conLocal.Open();
    using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conLocal))
    {
        bulkCopy.DestinationTableName = "dbo.TransfersHistory";

        try
        {
            using (SqlDataReader readerLocal = readLocal.ExecuteReader())
            {
                while (readerLocal.Read())
                {
                    bulkCopy.WriteToServer(readerLocal);
                }
            }
        }
        catch (Exception ex)
        {
            Globals.infoString = ex.Message;
            Globals.infoStringColor = true;
            var newForm = new pagePopupInfo();
            newForm.ShowDialog();
        }
        finally
        {
            conLocal.Close();
        }
    }
}
catch (Exception ex)
{
    Globals.infoString = ex.Message;
    Globals.infoStringColor = true;
    var newForm = new pagePopupInfo();
    newForm.ShowDialog();
}
finally
{
    conLocal.Close();
}

我愿意提出建议。谢谢

马修斯的建议奏效了。关于不复制数据的另一个问题是,它只是不复制第一条记录。我将代码更改为此,以解决该问题:

try
        {
            conLocal.Open();
            using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conLocal))
            {
                bulkCopy.DestinationTableName = "dbo.TransfersHistory";
                SqlDataReader readerLocal = readLocal.ExecuteReader();
                bulkCopy.WriteToServer(readerLocal);
            }
        }

1 个答案:

答案 0 :(得分:0)

之所以要使用两个,一个在另一个内,是因为它被视为两个连接。

您可以尝试以下方法:

                   using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conLocal))
                   using (SqlDataReader readerLocal = readLocal.ExecuteReader())
                    {
                        while (readerLocal.Read())
                        {
                            bulkCopy.WriteToServer(readerLocal);
                        }
                    }