自动化错误80004005

这几天我一直在殴打自己,在互联网上search。 我知道有很多我不太了解Com Interop,但是我已经成功地使用Excel来构build和使用更简单的DLL。 反正到了这一点。

我得到上面提到的错误-2147467259 80004005 Automation Error Unspecified Error Excel VBA中运行以下代码包装在一个DLL中。

 [GuidAttribute("96BE21CD-887B-4770-9FAA-CF395375AEA9")] [ComVisibleAttribute(true)] interface QInterface { void ConnectionFill(string SQLQuery, string CONStr); string QueryValue(int QueryKey); string ConnectionValue(int ConnectionKey); string outputFile { get; set; } void ThreadTest(); } [ClassInterfaceAttribute(ClassInterfaceType.None)] [ProgIdAttribute("QueryThread")] class QueryThread : QInterface { DataSet QueryReturn = new DataSet(); private ArrayList SQLList = new ArrayList(); private ArrayList ConList = new ArrayList(); private string OutputFile; public void ConnectionFill(string SQLQuery, string CONStr) { SQLList.Add(SQLQuery); ConList.Add(CONStr); } public string QueryValue(int QueryKey) { return SQLList[QueryKey].ToString(); } public string ConnectionValue(int ConnectionKey) { return ConList[ConnectionKey].ToString(); } public string outputFile { set { OutputFile = value; } get { return OutputFile; } } public void ThreadTest() { int i = 0; i = SQLList.Count; Thread[] myThreads; myThreads = new Thread[i]; for (int t = 0; t != i; t++) { myThreads[t] = new Thread(() => ThreadRun(SQLList[t].ToString(), ConList[t].ToString())); myThreads[t].Name = "Thread " + t; myThreads[t].IsBackground = true; myThreads[t].Start(); Thread.Sleep(600); if (t > 9) { myThreads[t - 9].Join(); } } for (int t = 0; t != i; t++) { while (myThreads[t].IsAlive) { Thread.Sleep(20); } } TextWriter tw = new StreamWriter(OutputFile); for (int t = 0; t < QueryReturn.Tables.Count; t++) { DataTableReader DR = QueryReturn.Tables[t].CreateDataReader(); while (DR.Read()) { tw.WriteLine("{0} : {1}", DR.GetValue(0), DR.GetValue(1)); } } tw.Close(); QueryReturn.Dispose(); } private void ThreadRun(string SQLString, string ConString) { try { OleDbConnection DBCon = new OleDbConnection(ConString); DBCon.Open(); Thread.Sleep(200); OleDbCommand DBCmd = new OleDbCommand(SQLString, DBCon); OleDbDataAdapter DataAdapter = new OleDbDataAdapter(DBCmd); Thread.Sleep(200); DataAdapter.Fill(QueryReturn, Thread.CurrentThread.Name.ToString()); DBCon.Close(); DataAdapter.Dispose(); DBCon.Dispose(); DBCmd.Dispose(); } finally { } } } 

使用这个VBA代码…

 Sub test() Dim QT As New QueryThreading.QueryThread Dim MyResults As String Dim outputfile As String Dim InputStuff(1, 1) As String InputStuff(0, 0) = "Select DISTINCT * From TrackingData;" InputStuff(0, 1) = "Provider =Microsoft.ACE.OLEDB.12.0;Data Source =C:\Users\Nick\Desktop\test.accdb; Persist Security Info =False;Connection Timeout=7;" InputStuff(1, 0) = "Select DISTINCT * From TrackingData;" InputStuff(1, 1) = "Provider =Microsoft.ACE.OLEDB.12.0;Data Source =C:\Users\Nick\Desktop\test2.accdb; Persist Security Info =False;Connection Timeout=7;" QT.ConnectionFill InputStuff(0, 0), InputStuff(0, 1) QT.ConnectionFill InputStuff(1, 0), InputStuff(1, 1) outputfile = "C:\Users\Nick\Desktop\testrun.txt" QT.outputfile = outputfile QT.ThreadTest End Sub 

它运行良好是一个纯粹的C#控制台应用程序。 工作完美,快捷,没有问题。 但通过VBA我得到的错误。

我假设这是与multithreading访问数据库的调用。 我知道里面有很多垃圾代码,当然我还没有优化,所以我仍然处于“玩转”阶段。

我已经使用RegAsm,并启用COM互操作和所有这些东西,我可以从回报中读回来就好了。 所以我知道DLL是正确的,只是当我填充线程并运行“ThreadTest()”我得到的自动化错误。

如果我第二次运行Excellocking。

任何帮助将不胜感激。

你正在调用QT.DictionaryFill虽然我似乎无法find一个相应的方法在你的C#代码…如果你改变调用QT.ConnectionFill而不是改变?

另一点:IIRC然后VBA在STA中运行对象 – 不知道MTA是否被支持

编辑:

根据这个相当古老的职位VBA不支持multithreading…