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