0

我正在使用 OleDbCommand 截断 DBF 文件。它适用于大多数文件,但如果文件大小为 400 MB,我会收到“未指定错误”。我在某处读到 dbf 文件的大小限制为 2 GB,所以我希望有一种方法可以处理这么大的文件......

System.Data.OleDb.OleDbException: Unspecified error
    at System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr)
    at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult)
    at System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult)
    at System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult)
    at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
    at System.Data.OleDb.OleDbCommand.ExecuteNonQuery()
    at OleDbTruncateTest.Program.Main(String[] args) in C:\Users\henjoh\Visual Studio 2008\Projects\OleDbTruncateTest\OleDbTruncateTest\Program.cs:line 22

以下是操作的基本代码:

using System;
using System.Data.OleDb;
using System.IO;

namespace OleDbTruncateTest
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                string file = @"C:\Temp\largefile.DBF";
                string pathName = Path.GetDirectoryName(file);
                string fileName = Path.GetFileName(file);

                using (OleDbConnection connection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + pathName + "; Extended Properties=dBase III"))
                {
                    connection.Open();
                    using (OleDbCommand comm = new OleDbCommand("DELETE FROM " + fileName, connection))
                    {
                        comm.ExecuteNonQuery();
                    }
                }
                Console.WriteLine("Done");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }

            Console.WriteLine("ENTER to exit...");
            Console.ReadLine();
        }
    }
}

关于如何截断大型 dbf 文件的任何想法?

4

1 回答 1

1

对于 .dbf 文件,通常源自 dBASE、Clipper 和 Foxpro(以及 Visual FoxPro),它们都是 32 位设计的,因此任何单个文件大小的上限为 2 gig。没办法,就这样。如果文件超过 2 gig 文件限制,则它必须是由其他可以读取 .dbf 文件的产品处理的 .DBF 文件,例如 Sybase 的 Advantage Database Server,它可以直接读取/写入/支持 .DBF 文件和超过 2 gig 限制。

如果您想真正截断(即:删除所有记录), delete from 只会标记要删除的记录并将记录保留在那里,直到您“打包”表。也就是说,由于我不使用 Microsoft JET OleDB 提供程序,而是使用Microsoft Visual FoxPro OleDbProvider 下载

然后,我将构建一个包含 VFP 命令的字符串,以专门打开表并 ZAP(它也会删除所有记录并打包和重建索引)......类似于

string VFPScript  = "ExecScript( "
      + "[USE " + fileName + " EXCLUSIVE] +chr(13)+chr(10) + "
      + "[IF USED( '" + fileName + "')] + chr(13)+chr(10) + "
         + "[ZAP] +chr(13)+chr(10)+ "
      + "[ENDIF] +chr(13)+chr(10)+ "
      + "[USE]  )";

// put this script into command object, then execute it...
using (OleDbCommand comm = new OleDbCommand( VFPScript, connection))
{
    comm.ExecuteNonQuery();
}

笔记。我不知道 JET 是否能够识别的唯一命令是 VFP 中的“ExecScript()”函数,它允许您将字符串作为命令块传递并像执行 .prg 一样执行它。因此,您可以执行循环和 IF/ENDIF 块之类的操作(有一些限制)。但是,此示例将字符串构建为

USE YourFile EXCLUSIVE
if used( "YourFile" )
   ZAP
ENDIF
USE

最后注。处理表名时。通过 OleDB 提供程序时隐含 .DBF 扩展名,因此您不希望将 .dbf 扩展名用作字符串的一部分。BOTH OleDbProviders 仍然会找到该表,只要它位于连接字符串指向的路径中。

祝你好运。

于 2012-04-16T11:08:55.480 回答