我的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)
能力的影响该怎么办。顺便提一下,它确实可以获取完整的字段数据。我认为只有架构提取是错误的。
答案 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
列的字段宽度,超出默认限制。