繁体   English   中英

“System.Data.OleDb.OleDbException:'无法更新。数据库或对象是只读的”使用 C# 从 .Dat 文件读取时出错

[英]"System.Data.OleDb.OleDbException: 'Cannot update. Database or object is read-only" Error while reading from .Dat file using C#

我正在尝试使用 Microsoft Jet Engine 提供程序读取 .Dat 文本文件,但得到“System.Data.OleDb.OleDbException:'无法更新。数据库或对象是只读的。'” ExcecuteReader 出现错误。 我的代码如下所示

 public static void ReadDatFile()
        {
            var query = "select * from VehiclePositions.dat";
            var connection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Users\\lenovo\\source\\repos\\ConsoleApp1\\ConsoleApp1\\;Extended Properties='text;ReadOnly=False'");
            connection.Open();

            OleDbCommand command = connection.CreateCommand();
            command.CommandText = query;
            command.CommandType = System.Data.CommandType.Text;

            var test=command.ExecuteReader();

            while(test.Read())
            {
                Console.WriteLine(test[0]);
            }
        }

我尝试将 HDR=NO;FMT=FixedLength 添加到扩展属性,但问题仍然存在,我不确定我在这里缺少什么。

看来问题是由文件上的扩展名 .dat 引起的。

互联网上的一些研究给了我一个关于寻找什么的线索。 在注册表中,OleDb 使用的文本驱动程序查看以下键:

(注意 64 位操作系统中 32 位驱动程序使用的 WOW6432Node)

HKLM\SOFTWARE\WOW6432Node\Microsoft\Jet\4.0\Engines\Text\Extensions

在此注册表项中列出了文本驱动程序打开的文件所允许的扩展名。 默认的是

txt,csv,tab,asc

因此,如果您将该文件更改为VehiclePosition.txt ,那么它就可以工作。
或者您可以在注册表项的末尾添加,dat并且事件当前文件名将起作用。

当然,您的文件夹中应该有一个schema.ini ,您可以在其中添加以下行

[VehiclePositions.dat]
Format=FixedLength
ColNameHeader=False
Col1=F1 Text Width 8
Col2=F2 Text Width 4
Col.........

有关 Schema.ini 键和格式的完整描述,您可以参考此Microsoft 文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM