2

我在 Visual Studio 2010 中编写了一个小程序来打开一个 Access 数据库,在表中输入一个值,然后打开一个表单。非常简单,该程序在我的笔记本电脑上运行良好。

当我尝试在第二台 PC 上运行 exe 时出现问题。我无法在表格中输入值。两台电脑都可以用 Visual Studio 2010 打开项目就好了。我运行它时收到的错误是:

"System.Runtime.InteropServices.COMException (0x800A09C5):RunSQL 操作已取消。\r\n 在 Microsoft.Office.Interop.Access.DoCmd.RunSQL(Object SQLStatement, Object UseTransaction)\r\n 在 OpenGasAlarmSheet.Program。 \Program.cs:line 47 中的 Main(String[] args)"

我将一些参数传递到一个字符串中以获得等效的:

String sql = "INSERT INTO tbl_LOG ([ALARM], [DATE]) 
              VALUES ('KNITERV4', #07-17-2012 10:22:29 AM#);"

这是运行该 SQL 字符串的部分程序的代码:

Access.Application oAccess = null;
oAccess = new Access.Application();
oAccess.OpenCurrentDatabase(<file path to mdb>, false);
oAccess.DoCmd.RunSQL(sql); //This is line 47

我已经尝试修复这个错误大约一周了,但我完全陷入了困境。任何帮助将非常感激!!!

谢谢,克里斯


编辑:2012 年 7 月 18 日

这就是我所在的地方......

选项1:

String sql = "INSERT INTO tbl_LOG ([ALARM], [DATE]) 
     VALUES ('KNITERV4', #07-17-2012 10:22:29 AM#);";
oAccess.CurrentDb().Execute(sql); //ERROR HERE

结果是.....

PC #1:工作正常!

PC #2 & #3:错误(见下文)

"System.Runtime.InteropServices.COMException (0x8002801D):库未注册。(来自 HRESULT 的异常:0x8002801D (TYPE_E_LIBNOTREGISTERED))\r\n 在 Microsoft.Office.Interop.Access.ApplicationClass.CurrentDb()\r\n 在测试.Program.Main(String[] args) 在 \Program.cs:line 47"

选项 2:

String sql = "INSERT INTO tbl_LOG ([ALARM], [DATE]) 
     VALUES ('KNITERV4', #07-17-2012 10:22:29 AM#);";
oAccess.DoCmd.RunSQL(sql); //ERROR HERE

结果是.....

PC #1:工作正常!

PC #2 & #3:错误(见下文)

"System.Runtime.InteropServices.COMException (0x800A09C5):RunSQL 操作已取消。\r\n 在 Microsoft.Office.Interop.Access.DoCmd.RunSQL(Object SQLStatement, Object UseTransaction)\r\n 在 OpenGasAlarmSheet.Program。 \Program.cs:line 47 中的 Main(String[] args)"

选项 3:

cn.ConnectionString = oAccess.CurrentProject.Connection.ConnectionString; //ERROR HERE
cn.Open();

rs.ActiveConnection = cn;
rs.LockType = ADODB.LockTypeEnum.adLockBatchOptimistic;
rs.CursorType = ADODB.CursorTypeEnum.adOpenKeyset;
rs.CursorLocation = ADODB.CursorLocationEnum.adUseClient;

rs.Open("tbl_LOG");
rs.AddNew("ALARM", "KNITERV4");
rs.UpdateBatch();

结果是.....

PC #1 & #3:错误(见下文)

"System.Runtime.InteropServices.COMException (0x8000FFFF):灾难性故障(来自 HRESULT 的异常:0x8000FFFF (E_UNEXPECTED))\r\n 在 Microsoft.Office.Interop.Access._CurrentProject.get_Connection()\r\n
在 Test.Program .Main(String[] args) 在 \Test\Program.cs:line 38"

PC #2:工作正常!!!

我不能让这个东西在多台电脑上工作。令人沮丧!:(

4

1 回答 1

3

帮助 OP 可能为时已晚,但希望这能帮助像我这样找不到答案的人。

对我来说,该The RunSQL action was canceled.错误的解决方案是在 Access 中打开 MDB,然后单击启用内容按钮。该文件是在客户端机器上生成的(当然,在我们的网络外部)。从 TortoiseSVN 显示文件在那之后发生更改并且我能够提交这些更改的事实来看,似乎启用内容会物理修改文件。它必须在文件中存储一些权限,甚至可能在每台机器的基础上存储权限,并且即使在通过互操作执行时也要使用它们。

这是使用 MS Access 2010。

于 2013-06-05T00:41:40.900 回答