0

Pervasive.SQL テーブルに、LongVarChar基本的に文字列データ用に設計された blob タイプ フィールドであるタイプのテーブルがあります。

このテーブルに対してを実行するPsqlDataReaderと、リーダーがレポートするフィールド サイズは 65500IsLongですtrue

フィールド サイズが 65500 よりもはるかに大きいか、または -1 であると予想していました。

一般的に行うのに十分なレベルでこれを制御できますか? のように、私が読んでいるテーブルやそれに含まれるフィールドについて何も知らずに? フィールドが巨大であることを自動的に認識し、適切に大きなサイズを設定するように指示する方法はありますか?

スキーマを取得し、フィールド サイズを 65500 から 65500 にリセットしInt32.MaxValue、リーダーからデータをロードすることで、必要な結果を手動でテストしたことに注意してください。65500 では、制約例外が発生します。ではInt32.MaxValue、私はしません。

Pervasive のドキュメントにある追加情報:

SQLGetData の 1 回の呼び出しで、LONGVARCHAR または LONGVARBINARY 列に対して Pervasive PSQL によって返される最大文字数は 65500 です。65500 文字を超える列データを取得するには、SQLGetData を複数回呼び出す必要があります。

PsqlDataReaderこれが、 が 65500 のサイズになっている理由を説明しているようです。しかし...その制限が私の能力に与える影響についてどうしたらよいかまだわかりませんDataTable.Load(reader). ところで、完全なフィールド データをフェッチします。間違っているのはスキーマのフェッチだけだと思います。

4

2 に答える 2

0

これは、しばらく前に同様の問題を抱えている他の誰かのために書いたコードです。テキスト ファイルを LongVarChar フィールドにロードし、それを読み込んで新しいファイルに書き込みます。

using System;
using System.Data;
using System.Data.SqlTypes;
using System.IO;
using Pervasive.Data.SqlClient;

class LoadText
{
    static string fileName = @"loadtext.txt";

    static PsqlConnection conn = null;
    static PsqlCommand cmd = null;

    static void Main()
    {
        try
        {
            string textFile = fileName;
            Console.WriteLine("Loading File: " + textFile);
            conn = new PsqlConnection(@"ServerDSN=DEMODATA");
            conn.Open();
            cmd = new PsqlCommand();
            cmd.Connection = conn;
            cmd.CommandText = @"create table texttable(textfile varchar(255),textdata longvarchar)";
            //cmd.ExecuteNonQuery();

            cmd.CommandText = @"insert into texttable values (?,?)";
            cmd.Parameters.Add("@textfile", PsqlDbType.VarChar, 30);
            cmd.Parameters.Add("@textdata", PsqlDbType.LongVarChar, 1000000);

            Console.WriteLine("Loading File: " + textFile);

            FileStream fs1 = new FileStream(textFile, FileMode.Open, FileAccess.Read);
            StreamReader sr1 = new StreamReader(fs1);
            string textData = "";
            textData = sr1.ReadToEnd();

            Console.WriteLine("TextBytes has length {0} bytes.", textData.Length);

            //string textData = GetTextFile(textFile);
            cmd.Parameters["@textfile"].Value = textFile;
            cmd.Parameters["@textdata"].Value = textData;

            cmd.CommandText = cmd.CommandText;
            cmd.ExecuteNonQuery();

            Console.WriteLine("Loaded {0} into texttable.", fileName);

            cmd.CommandText = "select * from texttable";
            PsqlDataReader dr = cmd.ExecuteReader();
            if (dr.HasRows)
            {
                dr.Read();
                textFile = @"Output.txt";
                StreamWriter sw = new StreamWriter(textFile);
                sw.Write(dr[1].ToString());
                Console.WriteLine("TextFile: {0}.\nTextData written to {1}", dr[0].ToString(), textFile);
            }

        }
        catch (PsqlException ex)
        {
            Console.WriteLine(ex.ToString());
        }
        finally
        {
            conn.Close();
        }
    }
}
于 2014-05-02T10:19:50.797 に答える