ADO无法报告数据库是否标记为只读?

时间:2010-08-02 23:53:11

标签: delphi ado

如果在Windows桌面属性中为.dbf或.mdb文件选中“只读”, 和Delphi 6 ADO连接(例如,通过Jet获取.mdb文件或使用ODBC获取.dbf文件) 然后用于打开该数据库,TADOTable.CanModify返回true和 TADOTable.ReadOnly返回false,显然无法检测到文件 实际上是只读的。

从VCL源代码看起来.CanModify只是从Supports(xUpdates)设置的 和.ReadOnly是从LockType(甚至是“只读数据源”)中设置的 TADOConnection.Properties返回0),因此这些属性看起来更像 用于检测连接字符串选项的工具,而不是检测 数据库的原始只读状态。

因此,检测数据库的正确ADO技术标记为只读 之前尝试使用TADOTable.Edit?似乎解决方案 特定于Windows文件,但某种与数据库无关的技术 只使用ADO。解决方案是什么?

2 个答案:

答案 0 :(得分:1)

我知道这个问题很旧,但是似乎可接受的答案至少是不完整的。根据我自己的实验,看来您 可以在尝试编辑数据之前检测到只读数据库:

我的设置:

我使用以下ConnectionString创建一个到MDB文件的TADOConnection:MyADOConnection.Mode我使用了几个标志,但是它们在这里似乎无关紧要。

通常在连接时,cmUnknowncmShareDenyNone切换到C:\SomePath\MyDatabase.mdb

我的观察:

Mode文件被操作系统标记为只读时,连接的cmRead属性将切换为TADODataset

我可以直接从MyDataset.Connection.ModeMode访问此属性

旁注:在我的实验中,后续的连接需要将cmUnknown重置为cmShareDenyNone,以便它能够正确地切换回Mode

请注意,即使cmShareDenyNone返回 Caused by: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,1] Message: Content is not allowed in prolog. at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(XMLStreamReaderImpl.java:604) ~[?:1.8.0_171] at org.glassfish.jersey.jaxb.internal.AbstractCollectionJaxbProvider.readFrom(AbstractCollectionJaxbProvider.java:344) ~[jersey-media-jaxb-2.24.1.jar:?] ,由于其他各种原因,仍然可能无法编辑一行。但是,这确实解决了最初的问题,即如何检测被OS标记为“只读”的MDB。

答案 1 :(得分:0)

很可惜,但你做不到。

但是,由于文件名是连接字符串的一部分,您可以自己查看。