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

通常、dBASE、Clipper、Foxpro (および Visual FoxPro) で作成された .dbf ファイルは、すべて 32 ビットで設計されているため、1 つのファイル サイズの上限は 2 GB です。仕方がない、それだけです。ファイルが 2 GB のファイル制限を超えている場合は、.DBF ファイルを直接読み取り/書き込み/サポートできる Sybase の Advantage Database Server など、.dbf ファイルを読み取ることができる他の製品によって処理される .DBF ファイルである必要があります。 2 ギガの制限を超えます。

完全に切り詰める (つまり、すべてのレコードを削除する) 場合、delete from はレコードに削除のマークを付けるだけで、テーブルを「パック」するまでレコードをそこに残します。そうは言っても、私は Microsoft JET OleDB プロバイダーを使用していないため、Microsoft Visual FoxPro OleDbProvider downloadを使用しています。

次に、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 で文字列をコマンドのブロックとして渡し、.prg であるかのように実行できる "ExecScript()" 関数です。そのため、ループや IF/ENDIF ブロックなどを実行できます (いくつかの制限があります)。ただし、この例では文字列を次のように構築しています

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

ファイナルノート。テーブル名を扱うとき。.DBF 拡張子は、OleDB プロバイダーを通過するときに暗示されるため、.dbf 拡張子を文字列の一部として使用しないでください。両方の OleDbProvider は、接続文字列が指すパスにある限り、テーブルを検索します。

幸運を。

于 2012-04-16T11:08:55.480 に答える