Как распространить исключение .Net, чтобы VBA распознала ошибку - PullRequest
0 голосов
/ 08 июля 2019

У меня есть 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 это происходит так, как будто ошибки не было.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...