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

时间:2017-02-25 02:25:32

标签: java ms-access jacob

我尝试使用Application.Run(https://msdn.microsoft.com/en-us/library/office/ff193559.aspx)使用Jacob通过Java运行Access函数。我可以打开和关闭Access数据库,但不能运行函数。我怀疑运行调用实际上是通过但是我已经打开文件只读(可能?不确定我做了)然后导致访问错误:运行时错误3073:操作必须使用可更新查询。查询只是将两个字符串附加到我创建的测试表上,并且该查询是手工完成的,但到目前为止还没有通过Java。

如果错误是我以只读方式打开它,我该怎么打开它不是只读的?如果它是其他东西,我如何使用雅各布调用函数(或宏,或者可以工作)?或者除了使用雅各布之外你也可能知道其他一些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;

0 个答案:

没有答案