【问题标题】:Receiving values back after calling a sub in Access through .NET通过 .NET 在 Access 中调用 sub 后接收值
【发布时间】:2013-06-30 18:05:42
【问题描述】:

我正在创建一个必须在 Access mdb 数据库文件中调用 subs 的 C# 应用程序。

我在 mdb 文件中创建了一个测试子程序,我可以从 C# 调用它并传递参数。一切正常,但我想将结果传递回 C#。我知道我不能用函数来做到这一点,所以是否可以通过引用传递变量,然后 vba 可以更改变量并得到我的结果?我尝试了以下方法,但它不起作用。有人知道这是否可能吗?

谢谢

VBA 测试子:

Sub test(Byref p1 As String)
   p1="bar"
   MsgBox p1
End Sub

从 C# 调用它:

Access.Application oAccess = new Access.Application();
oAccess.Visible = true;
oAccess.OpenCurrentDatabase("d:\\tmp\\test1.mdb", false, "");
string t;
t = "foo"
oAccess.Run("test", t);
//t still equals "foo" at this point, it should be equal to "bar"

【问题讨论】:

  • 为什么不能使用函数?
  • 我觉得有必要提一下,虽然可以做到这一点很有趣,但在C#中不能直接创建这样一个函数的情况并不多。
  • @Andy。好点,我没有考虑到这一点。
  • @Layman:我在这里读到:stackoverflow.com/questions/7548762/…。但我只是测试了它,我可以创建一个函数!我猜我不应该相信我在 SO 上读到的所有内容。
  • @Johan:关于您上面的 cmets,OP(在那个问题中)询问了一个用 MSAccess 编写并在 c# 的 SQL 查询中使用的函数。我没有尝试过,不知道它是否会起作用。没有什么可以不相信它,除非你有答案让它无效。

标签: c# vba ms-access


【解决方案1】:

对于标量(简单的数字、字符串或布尔值),系统会生成一个 当前值的副本并将此副本传递给被调用的 程序。从被调用过程返回后,系统丢弃 副本。所以,即使被调用的过程改变了 ByVal 参数,该更改无法传播回 调用者。

查看this 以了解有关传递标量值的说明。如页面所述,被调用者可以修改对象的属性,从而调用者可以看到修改后的值(在使用对象的情况下)。

另一种选择是使用函数的返回值。

编辑:

Function test(p1 As String) as String
   test = "Bar"
End Function

c#

t = "foo"
t = oAccess.Run("test", t);

【讨论】:

    猜你喜欢
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多