我有一段代码即使在循环中也能完美运行。该块将连接,抓取一个 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();
认为这是我所缺少的,但没有这样的运气。
谁能给我一个关于我在这里俯瞰什么的提示?
谢谢你。