如何使sqlDataReader对Long VarChar字段类型使用更大的大小?

时间:2014-05-01 17:40:18

标签: c# datareader pervasive-sql

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

当我对此表执行PsqlDataReader时,读者为该字段报告的字段大小为65500. IsLong还有一个标记,正确为true。< / p>

我原本期望字段大小要么大于65500,要么是-1,因为我认为我明白这是“只要它需要”的标志,或者某种类似的东西。 / p>

我是否可以在足够高的水平上对此进行任何控制以进行一般性操作?就像在,我不知道有关我正在阅读的表格,或它包含的字段?某种方式告诉它自动识别该字段是否很大并因此设置适当大的尺寸?

请注意,我已经通过检索架构手动测试了我想要的结果,将字段大小从65500重置为Int32.MaxValue,然后从阅读器加载数据。使用65500,我会得到一个约束异常。在Int32.MaxValue,我没有。

Pervasive文档中的其他信息:

  

在单次调用SQLGetData时,最大字符数   Pervasive PSQL为LONGVARCHAR或LONGVARBINARY列返回   是65500.必须多次调用SQLGetData才能检索列   数据超过65500个字符。

这似乎解释了为什么PsqlDataReader的大小达到了65500.可能他们打了一个电话并使用了这个大小。但是......仍然不知道该限制对我DataTable.Load(reader)能力的影响该怎么办。顺便提一下,它确实可以获取完整的字段数据。我认为只有架构提取是错误的。

2 个答案:

答案 0 :(得分: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();
        }
    }
}

答案 1 :(得分: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列的字段宽度,超出默认限制。