小编tra*_*or1的帖子

如何从C#代码中捕获Microsoft Access VBA调试错误?

我有一个C#程序,它打开几个Microsoft Access文件,并从每个文件中执行功能.

本质上,代码看起来像这样:

Microsoft.Office.Interop.Access.Application app =
    new Microsoft.Office.Interop.Access.Application();

app.Visible = true;
app.OpenCurrentDatabase(accessFileFullPath, false, "");

//Call the function
app.Eval(function);
Run Code Online (Sandbox Code Playgroud)

但是,当VBA代码中发生调试错误时,我想将其捕获到我的C#程序中.

不要回答:"在您的VBA程序中捕获错误".由于我不会涉及的原因,这是不可能的.

我过去使用的一种方法是让一个线程间歇性地监视任何Visual Basic Debug窗口的句柄(FindWindowEx Win32函数返回非零值).我不喜欢这种方法,也不想继续使用它.

我找到了这个适用于Microsoft Excel的线程.从本质上讲,它使用的Microsoft.VisualBasic.CallByName()功能显然可以被困在try/catch块中,而无需用户交互.但是,我无法使用Microsoft Access - 主要是因为我无法弄清楚如何使用此命令调用函数/ sub.

任何建议都将真诚地感谢!

编辑:正如我在下面的一个答案中提到的,我尝试Eval()在try/catch块中包装,我的C#程序似乎忽略它,直到用户点击"Microsoft Visual Basic"错误对话框上的"结束"按钮.我不希望任何用户交互,而是想要捕获VBA错误以便在我的C#程序中处理.

c# ms-access vba office-interop

7
推荐指数
1
解决办法
2232
查看次数

获取错误:在FROM子句中多次指定相关名称"General"

ALTER PROCEDURE [dbo].[REPORTING_MonthlyClientTimesheet_wrapper2_TRR_Month]
      (@StartDate DATETIME,
       @taskcode VARCHAR(250),
       @username VARCHAR(250))
AS 
BEGIN 
      SET NOCOUNT ON 
      DECLARE @ProcedureName SYSNAME     

        -- Give them one full month of records
      DECLARE @EndDate DATETIME


      SET @ProcedureName = OBJECT_NAME(@@PROCID) 

       --SET @EndDate = DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@StartDate)+1,0)) -- end month
      SET @EndDate = DATEADD(s, -1, DATEADD(YY, DATEDIFF(YYYY, 0, @StartDate) + 1, 0)) --set to end of Year


      BEGIN TRY


            SELECT DISTINCT
                @username,
                cal.calendaryear,
                cal.calendarmonth,
                cal.calendarday,
                DATEPART(wk, Calendardate) AS weekno,
                DATENAME(month, DATEADD(month, cal.calendarmonth - 1, 0)) AS iMonthName,
                DATEADD(s, -1, DATEADD(YY, …
Run Code Online (Sandbox Code Playgroud)

sql

0
推荐指数
1
解决办法
4420
查看次数

标签 统计

c# ×1

ms-access ×1

office-interop ×1

sql ×1

vba ×1