C# 如何使PsqlDataReader对LongVarChar字段类型使用更大的大小?

C# 如何使PsqlDataReader对LongVarChar字段类型使用更大的大小?,c#,datareader,pervasive-sql,C#,Datareader,Pervasive Sql,我的perversal.SQL表中有一个类型为LongVarChar的表,它本质上是为字符串数据设计的blob类型字段 当我对该表执行PsqlDataReader时,读卡器报告的字段大小为65500。还有一个标志表示IsLong,它正确地表示true 我本以为字段的大小会比65500大很多,或者-1,因为我想我知道这是“只要需要”的标志,或者类似的东西 我是否有足够高的级别来控制这一点,以便一般地进行控制?如中所示,在不知道我正在读取的表或其中包含的字段的情况下?有什么方法可以告诉它自动识别出磁

我的perversal.SQL表中有一个类型为
LongVarChar
的表,它本质上是为字符串数据设计的blob类型字段

当我对该表执行
PsqlDataReader
时,读卡器报告的字段大小为65500。还有一个标志表示
IsLong
,它正确地表示
true

我本以为字段的大小会比65500大很多,或者-1,因为我想我知道这是“只要需要”的标志,或者类似的东西

我是否有足够高的级别来控制这一点,以便一般地进行控制?如中所示,在不知道我正在读取的表或其中包含的字段的情况下?有什么方法可以告诉它自动识别出磁场是巨大的,从而设置一个合适的大尺寸

请注意,通过检索模式,将字段大小从65500重置为
Int32.MaxValue
,然后从读取器加载数据,我已经手动测试了所需的结果。对于65500,我将得到一个约束异常。在
Int32.MaxValue
中,我没有

普适公司文档中的其他信息:

在对SQLGetData的单个调用中,最大字符数 由普及PSQL为LONGVARCHAR或LONGVARBINARY列返回 是65500。必须多次调用SQLGetData才能检索列 超过65500个字符的数据


这似乎解释了为什么
PsqlDataReader
的大小为65500。很可能他们只打了一个电话就用了这个尺寸。但是…我仍然不知道该怎么做才能消除这个限制对我
DataTable.Load(reader)
能力的影响。顺便说一下,它确实获取了完整的字段数据。我认为只有模式获取是错误的。

这是我不久前为其他有类似问题的人编写的一些代码。它将文本文件加载到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();
        }
    }
}

由于这个问题从未得到答案,我将发布我最终使用的补救方法:

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

此代码出现在将数据加载到
DataTable
的方法末尾附近。填充表后,此循环将开始并扩展任何
LongVarChar
列的字段宽度,超过默认限制。

您使用的是什么版本的PSQL?什么版本的ADO.NET提供程序?您是否认为必须更改的不是数据加载,而是存储时刻?我不确定如何解释这对我有什么帮助。