0

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

当我PsqlDataReader对这个表执行 a 时,阅读器报告的字段大小为 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)。顺便说一句,它确实获取了完整的字段数据。我认为只有模式获取是错误的。

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 回答
0

由于这从未得到答案,我将发布我最终使用的补救措施:

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

此代码出现在将数据加载到DataTable. 一旦表格被填满,这个循环就会启动并扩展任何LongVarChar列的字段宽度,超过默认限制。

于 2015-06-03T19:35:16.970 回答