Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用jacob运行ms access函数-运行时错误3073可更新查询-以只读方式打开_Java_Ms Access_Jacob - Fatal编程技术网

Java 使用jacob运行ms access函数-运行时错误3073可更新查询-以只读方式打开

Java 使用jacob运行ms access函数-运行时错误3073可更新查询-以只读方式打开,java,ms-access,jacob,Java,Ms Access,Jacob,我正在尝试使用Jacob和Application.run()通过Java运行访问函数。我可以打开和关闭Access数据库,但不能运行函数。我怀疑运行调用确实通过了,但是我以只读方式打开了文件(可能?不确定我是否打开了),这导致了访问错误:运行时错误3073:操作必须使用可更新的查询。该查询只是将两个字符串附加到我创建的测试表上,该查询可以手动进行,但到目前为止还不能通过Java进行 如果错误是我以只读方式打开了它,我如何才能以非只读方式打开它?如果是其他的,我如何使用Jacob调用函数(或者宏,

我正在尝试使用Jacob和Application.run()通过Java运行访问函数。我可以打开和关闭Access数据库,但不能运行函数。我怀疑运行调用确实通过了,但是我以只读方式打开了文件(可能?不确定我是否打开了),这导致了访问错误:运行时错误3073:操作必须使用可更新的查询。该查询只是将两个字符串附加到我创建的测试表上,该查询可以手动进行,但到目前为止还不能通过Java进行

如果错误是我以只读方式打开了它,我如何才能以非只读方式打开它?如果是其他的,我如何使用Jacob调用函数(或者宏,两者都可以)呢?或者,除了使用Jacob,您可能还知道其他一些Java技术,我也这么认为

最起码的例子:

Java程序

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComThread;
import com.jacob.com.Dispatch;
import com.jacob.com.LibraryLoader;
import com.jacob.com.Variant;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author evans
 */
public class Test {
    public static void main(String[] args) {
        // Load library/.dll
        try {    
            String libFile = System.getProperty("os.arch").equals("amd64") ? "jacob-1.18-x64.dll" : "jacob-1.18-x86.dll";
            FileInputStream inputStream = new FileInputStream(new File(libFile));
            File temporaryDll = File.createTempFile("jacob", ".dll");
            try (FileOutputStream outputStream = new FileOutputStream(temporaryDll)) {
                byte[] array = new byte[8192];
                for (int i = inputStream.read(array); i != -1; i = inputStream.read(array)) {
                    outputStream.write(array, 0, i);
                }
            }
            System.setProperty(LibraryLoader.JACOB_DLL_PATH, temporaryDll.getAbsolutePath());
            LibraryLoader.loadJacobLibrary();        
            temporaryDll.deleteOnExit(); 
        } catch (IOException ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
        }

        // Open thread
        ComThread.InitSTA(true);

        // New application
        ActiveXComponent ComBridge = new ActiveXComponent("Access.Application");

        // Open database
        Dispatch.put(ComBridge, "Visible", new Variant(true));
        ComBridge.invoke("OpenCurrentDatabase", new Variant("C:/Users/evans/Documents/Book Business/Building Reports/Book Business.accdb"));

        // Run function
        ComBridge.invoke("Run", new Variant("Test"));

        // Shutdown
        ComBridge.invoke("Quit");
        ComThread.quitMainSTA();
        ComThread.Release();
    }
}
访问查询:

INSERT INTO tblTest ( Test, Test2 )
SELECT "a" AS Expr1, "B" AS Expr2;

我可以用JACOB 1.18复制你的问题。Access实例启动,数据库打开,但当我切换到Access时,我看到数据库以只读方式打开(在我的情况下,活动内容被禁用)。您真的需要在该数据库中运行VBA
Sub
和/或
Function
代码吗(可能包括从Access保存的查询中调用的自定义VBA函数)?@Gord Thompson在我的实际数据库中,我的代码运行一系列查询,一些条件取决于链接表是否为空(我不知道如何使用宏)。它可能表示为宏,而不是函数(如果我解决了链接表的问题)。但在未来,我知道我还想做函数,而不是宏。另一个选择是JACOB将整个VBA代码翻译成Java(我知道你可以调用特定的查询等),但如果我不能简单地运行宏或函数,我想完全翻译它可能会打开一个新的蠕虫罐。你对“蠕虫罐”的警惕是对的。有没有令人信服的理由坚持使用Java而不是使用C#?(…或者那“可能”更大?:)是的,从来没有做过C#,所以可能整个canYou都会感到惊讶。是用C#编写的示例应用程序。我可以(某种程度上)使用JACOB 1.18复制您的问题。Access实例启动,数据库打开,但当我切换到Access时,我看到数据库以只读方式打开(在我的情况下,活动内容被禁用)。您真的需要在该数据库中运行VBA
Sub
和/或
Function
代码吗(可能包括从Access保存的查询中调用的自定义VBA函数)?@Gord Thompson在我的实际数据库中,我的代码运行一系列查询,一些条件取决于链接表是否为空(我不知道如何使用宏)。它可能表示为宏,而不是函数(如果我解决了链接表的问题)。但在未来,我知道我还想做函数,而不是宏。另一个选择是JACOB将整个VBA代码翻译成Java(我知道你可以调用特定的查询等),但如果我不能简单地运行宏或函数,我想完全翻译它可能会打开一个新的蠕虫罐。你对“蠕虫罐”的警惕是对的。有没有令人信服的理由坚持使用Java而不是使用C#?(…或者那“可能”更大?:)是的,从来没有做过C#,所以可能整个canYou都会感到惊讶。您的示例应用程序是C#。