不幸的是,我无法切换到pypyodbc或其他包,因为脚本很大,不方便重新设计。现在它使用 VBA API(OpenRecordSet、MoveFirst、MoveLast 方法等),但 pypyodbc 不反映此 API AFAIK。
现在我使用一种解决方法(杀死 MSACCESS.EXE 应用程序)。我会把它贴在这里。可能对遇到同样问题的人有用:
def close_by_force(app): # Took this function from https://stackoverflow.com/
# questions/10221150/cant-close-excel-completely-using-win32com-on-python,
# but had to redesign it to be usable to work with COM objects
import win32process
import win32gui
import win32api
import win32con
# Get the window's process id's
hwnd = app.hWndAccessApp()
t, p = win32process.GetWindowThreadProcessId(hwnd)
# Ask window nicely to close
win32gui.PostMessage(hwnd, win32con.WM_CLOSE, 0, 0)
# Allow some time for app to close
time.sleep(10) # not really necessary
# If the application didn't close, force close
try:
#print('pid='+str(p))
handle = win32api.OpenProcess(win32con.PROCESS_TERMINATE, 0, p)
if handle:
win32api.TerminateProcess(handle, 0)
win32api.CloseHandle(handle)
except:
pass
...
access = CreateObject('Access.Application')
DBEngine = access.DBEngine
db = DBEngine.OpenDatabase("C:\<my_db_path>")
.... some code (working with the database) ...
close_by_force(access.Application) # this is the crucial line
正如我在网上发现的那样,这个问题是一个老问题,并且在不同的主题上进行了讨论,但我在任何地方都没有看到确切的解决方案,例如:
http://www.xtremevbtalk.com/showthread.php?t=298607
在 C# 中,我应该如何关闭正在运行的线程(Access DB)?
http://python-list.python.narkive.com/gCMlrB8M/using-excel-with-python
还发现我可以使用 System.Runtime.InteropServices.Marshal.ReleaseComObject(access) 之类的东西,但我找不到任何链接,我可以在哪里获得相关的 Python 包来使用这些类。
--
亲切的问候,
亚历山大。