0

ループでも完全に機能するコード ブロックがあります。このブロックは接続し、xml ファイルを取得して db にロードします。ループ内の場合は、ソース ディレクトリ内のすべての 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 ファイルが読み込まれ、このブロックによって変更されます。ループが 2 番目のファイルで開始されると、objBL.Execute で次のエラーが発生します。

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