我正在尝试使用UCanAccess构建一个程序来帮助我编写一些Access数据库查询的脚本。最终,我想要从cron作业生成的每日报告。我连接到所述数据库的几个测试用例给出了以下异常:UCAExc ::: 3.0.0需要列或不能删除表的唯一列。
我是数据库中的笨蛋,这个数据库由公司组织的其他部分维护。
getConnection调用抛出异常。
紧凑和修复后输出console.sh:无法执行:CREATE CACHED TABLE EMPL()需要列或不能删除表的唯一列 加载表:
已加载的查询:
已加载的索引:
net.ucanaccess.jdbc.UcanaccessSQLException:UCAExc ::: 3.0.0需要 列或不能删除表的唯一列 net.ucanaccess.jdbc.UcanaccessDriver.connect(UcanaccessDriver.java:258) 在java.sql.DriverManager.getConnection(DriverManager.java:571)at java.sql.DriverManager.getConnection(DriverManager.java:187)at net.ucanaccess.console.Main.main(Main.java:145)引起: java.sql.SQLSyntaxErrorException:需要列或不能删除sole org.hsqldb.jdbc.JDBCUtil.sqlException(未知 来源)org.hsqldb.jdbc.JDBCUtil.sqlException(未知来源)at at org.hsqldb.jdbc.JDBCStatement.fetchResult(未知来源)at org.hsqldb.jdbc.JDBCStatement.executeUpdate(未知来源)at net.ucanaccess.converters.LoadJet.exec(LoadJet.java:1416)at at net.ucanaccess.converters.LoadJet.access $ 000(LoadJet.java:71)at at net.ucanaccess.converters.LoadJet $ TablesLoader.createSyncrTable(LoadJet.java:481) 在 net.ucanaccess.converters.LoadJet $ TablesLoader.createSyncrTable(LoadJet.java:411) 在 net.ucanaccess.converters.LoadJet $ TablesLoader.createTable(LoadJet.java:807) 在 net.ucanaccess.converters.LoadJet $ TablesLoader.createTable(LoadJet.java:761) 在 net.ucanaccess.converters.LoadJet $ TablesLoader.createTables(LoadJet.java:942) 在 net.ucanaccess.converters.LoadJet $ TablesLoader.loadTables(LoadJet.java:1036) 在 net.ucanaccess.converters.LoadJet $ TablesLoader.access $ 2900(LoadJet.java:273) 在net.ucanaccess.converters.LoadJet.loadDB(LoadJet.java:1479)at net.ucanaccess.jdbc.UcanaccessDriver.connect(UcanaccessDriver.java:243) ... 3更多引起:org.hsqldb.HsqlException:需要列或 不能放下桌子的唯一一列 org.hsqldb.error.Error.error(未知来源)at org.hsqldb.error.Error.error(未知来源)at org.hsqldb.ParserDDL.compileCreateTableBody(未知来源)at org.hsqldb.ParserDDL.compileCreateTable(未知来源)at org.hsqldb.ParserDDL.compileCreate(未知来源)at org.hsqldb.ParserCommand.compilePart(未知来源)at org.hsqldb.ParserCommand.compileStatements(未知来源)at org.hsqldb.Session.executeDirectStatement(未知来源)at org.hsqldb.Session.execute(未知来源)... 16更多UCAExc ::: 3.0.0 需要列或不能删除表的唯一列
答案 0 :(得分:0)
如果UCanAccess包含未定义列的表,则在打开数据库时将抛出异常。
没有列的表不是有效表。访问本身不允许我们保存这样的表...
...但是可以使用DDL创建这样的表,如下面的VBScript
Option Explicit
Dim con
Set con = CreateObject("ADODB.Connection")
con.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\__tmp\31886535.accdb"
On Error Resume Next
con.Execute "DROP TABLE BadTable"
On Error Goto 0
con.Execute "CREATE TABLE BadTable (foo INT)"
con.Execute "ALTER TABLE BadTable DROP COLUMN foo"
con.Close
要在使用UCanAccess打开数据库时避免错误,只需在Access中打开数据库并删除没有定义列的表。