如果在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。解决方案是什么?
答案 0 :(得分:1)
我知道这个问题很旧,但是似乎可接受的答案至少是不完整的。根据我自己的实验,看来您 可以在尝试编辑数据之前检测到只读数据库:
我的设置:
我使用以下ConnectionString创建一个到MDB文件的TADOConnection:MyADOConnection.Mode
我使用了几个标志,但是它们在这里似乎无关紧要。
通常在连接时,cmUnknown
从cmShareDenyNone
切换到C:\SomePath\MyDatabase.mdb
。
我的观察:
当Mode
文件被操作系统标记为只读时,连接的cmRead
属性将切换为TADODataset
。
我可以直接从MyDataset.Connection.Mode
到Mode
访问此属性
旁注:在我的实验中,后续的连接需要将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)
很可惜,但你做不到。
但是,由于文件名是连接字符串的一部分,您可以自己查看。