0

我有一段代码即使在循环中也能完美运行。该块将连接,抓取一个 xml 文件,并将其加载到数据库中,如果在循环中将对源目录中的所有 xml 文件执行此操作。

[STAThread]
static void BulkLoad(string file, string schemaFile, string tempFile, string connString) //Bulk Loads the XML into SQL - process needs to complete before any other datamanipulation
    {
            // Using the class to use SQL XML Bulk Load (version 4.0)
            SQLXMLBulkLoad4Class objBL = new SQLXMLBulkLoad4Class();
            // ConnString - from Form - format is different as it uses the SQLXMLBulkLoad Class
            //string Connstring = this.ConnString.Text;
            objBL.ConnectionString = (connString);

            //Error Log File if needed
            objBL.ErrorLogFile = "errorLog.xml";
            objBL.KeepIdentity = false;  
            objBL.ForceTableLock = true;
            objBL.CheckConstraints = false;
            objBL.XMLFragment = false;
            objBL.Execute((schemaFile), (tempFile)); 
    }

我的挑战是我需要处理新导入的数据。因此,作为同一循环的一部分,我调用其他块,例如:

public void BulkCopyNonRegulated()
    {
        // Create source connection
        // ConnStr - is the Main Database
        string sourceConnStr = this.ConnStr.Text;
        SqlConnection source = new SqlConnection(sourceConnStr);
        // Create destination connection
        // destConnStr - destination database
        string destConnStr = this.NonRegConStr.Text;
        SqlConnection destination = new SqlConnection(destConnStr);
        // Open source and destination connections.
        source.Open();
        destination.Open();
        //cmd.ExecuteNonQuery();
        // Select data from Source table
        SqlCommand cmd = new SqlCommand("SelNonRegCommodities", source);
        //cmd = new SqlCommand("SELECT * FROM Products", source);
        // Execute reader
        SqlDataReader reader = cmd.ExecuteReader();
        // Create SqlBulkCopy
        SqlBulkCopy bulkData = new SqlBulkCopy(destination);
        // Set destination table name
        bulkData.DestinationTableName = "_TEMP";
        // Write data
        bulkData.WriteToServer(reader);
        // Close objects
        bulkData.Close();
        source.Close();
        }

现在这个块也可以工作 - 第一次通过循环。如果这个块存在,第一个 xml 文件将被加载,并被这个块改变,那么当循环开始在第二个文件上时,它将在 objBL 处出错。执行此错误:

System.Runtime.InteropServices.COMException occurred
Message=Error connecting to the data source.
Source=Microsoft XML Bulkload for SQL Server
ErrorCode=-2147467259
StackTrace:
   at SQLXMLBULKLOADLib.SQLXMLBulkLoad4Class.Execute(String bstrSchemaFile, Object vDataFile)
   at DataLoader.Imports.BulkLoad(String file) in C:\MyDocs\Visual Studio 2010\Projects\PathFinder2\PathFinder\Imports.cs:line 375
InnerException: 

然后,我需要删除数据库,然后重新附加它以便能够访问它。我认为这个错误来自一个保持打开的连接,但我找不到。我什至添加了:destination.Close(); GC.Collect(); GC.WaitForPendingFinalizers();

认为这是我所缺少的,但没有这样的运气。
谁能给我一个关于我在这里俯瞰什么的提示?

谢谢你。

4

0 回答 0