У меня есть C # DLL, которая видна COM. Внутри одного из методов обнаруживается исключение .Net, которое я хотел бы распространить на VBA.
Я прочитал несколько статей Google, и этот пост здесь:
Обработка ошибок в C # / VBA COM Interop .
Код, который я имею, выглядит следующим образом:
[Guid("....")]
[ClassInterface(ClassInterfaceType.None)]
[ComVisible(true)]
[ProgId("...")]
public class DBCommand : IDBCommand
{
public string Read()
{
string lRetVal = string.Empty;
try
{
// Have we executed yet?
if (this._Reader == null)
{
this.Execute();
}
.
.
}
catch (SqlException e)
{
COMExceptionMessage ex = new COMExceptionMessage(e.Message, e.HResult);
throw ex;
}
}
private void Execute()
{
try
{
if (this._Reader == null)
{
this._Reader = this._Command.ExecuteReader();
this._HasRows = _Reader.HasRows;
this._Schema = _Reader.GetSchemaTable();
this._Fields = new object[this._Reader.FieldCount];
}
}
catch (SqlException e)
{
COMExceptionMessage ex = new COMExceptionMessage(e.Message, e.HResult);
throw ex;
}
}
Исходя из того, что я понимаю, CLR должен передать HRESULT COMException VBA?
Тестовый код VBA выглядит следующим образом:
Sub test()
On Error GoTo Err_test:
Dim lConn As SQLInventory.DBConnection
Dim lCmd As SQLInventory.DBCommand
Dim lResponse As String
Set lConn = New SQLInventory.DBConnection
Set lCmd = New SQLInventory.DBCommand
lConn.Authentication = DBAuthentication_Windows
lConn.Server = "SERVER01"
lConn.Database = "MyDB"
If Not lConn.Connect Then
GoTo Exit_test
End If
lCmd.Query = "SQL statement with a syntax error in it."
lResponse = lCmd.Read
While (lResponse <> "")
Debug.Print lResponse
lResponse = lCmd.Read
Wend
lCmd.Dispose
lConn.Disconnect
Exit_test:
Set lCmd = Nothing
Set lConn = Nothing
Exit Sub
Err_test:
MsgBox Err.Description
Resume Exit_test
End Sub
Я хочу добиться того, чтобы исключение .Net передавалось в VBA, и вступал в силу оператор On Error на уровне VBA.
В данный момент C # перехватывает SqlException, но на уровне VBA это происходит так, как будто ошибки не было.