Как заставить PsqlDataReader использовать больший размер для типа поля LongVarChar?

У меня есть таблица в моей таблице Pervasive.SQL, которая имеет тип LongVarChar, по сути, поле типа BLOB-объекта, предназначенное для строковых данных

Когда я выполню PsqlDataReader для этой таблицы размер поля, который читатель сообщает для поля, составляет 65500. Существует также флаг для IsLongчто справедливо true,

Я ожидал, что размер поля будет либо намного больше, чем 65500, либо -1, потому что я подумал, что понял, что это будет флаг "столько, сколько нужно", или что-то подобное.

Есть ли у меня контроль над этим на достаточно высоком уровне, чтобы сделать это в общем? Например, ничего не зная о таблице, которую я читаю, или о полях, которые она содержит? Какой-то способ сказать ему, чтобы он автоматически распознал, что поле массивное и таким образом установил соответственно большой размер?

Обратите внимание, что я вручную проверил желаемый результат, получив схему, сбросив размер поля с 65500 до Int32.MaxValue а затем загрузка данных из ридера. С 65500 я бы получил исключение ограничения. В Int32.MaxValue, Я не буду.

Дополнительная информация найдена в документации Pervasive:

В одном вызове SQLGetData максимальное количество символов, возвращаемых Pervasive PSQL для столбцов LONGVARCHAR или LONGVARBINARY, составляет 65500. Необходимо выполнить несколько вызовов SQLGetData для извлечения данных столбца длиной более 65500 символов.

Это, кажется, объясняет, почему PsqlDataReader получает размер 65500. Скорее всего, они делают один звонок и используют размер. Но... все еще не знаю, что делать с влиянием, которое это ограничение оказывает на мою способность DataTable.Load(reader), Кстати, он получает полные данные поля. Я думаю, что это только выборка схемы, которая является неправильной.

2 ответа

Решение

Поскольку ответа так и не было получено, я опубликую лекарство, которое я в итоге использовал:

foreach (DataColumn dc in dt.Columns)
{
    if (dc.DataType == typeof(String) && dc.MaxLength == 65500)  //only true for LongVarChar
        dc.MaxLength = Int32.MaxValue;
}

Этот код появляется в конце метода, который загружает данные в DataTable, Как только таблица заполнена, этот цикл запускается и расширяет ширину поля для любого LongVarChar столбцы, победив ограничение по умолчанию.

Вот код, который я написал для кого-то еще с подобной проблемой некоторое время назад. Он загружает текстовый файл в поле 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();
        }
    }
}
Другие вопросы по тегам