从数据库读取数据后需要返回DataTable,其中一列的数据类型为LongText用于存储大量文本。现在用DataTable.Load(IDataReader reader)抛出异常“未能启用约束。一行或多行中包含违反非空、唯一或外键约束的值。”
请问怎么处理啊?
dt.BeginLoadData();
dt.Load(reader);
dt.Constraints.Clear();
dt.EndLoadData();
试下
你好,这种方式还是不行的哦!!!
@々孤星☆泪♂: 如果这个不行的话,我也没太好办法,这些约束是从db中带出来的,db中数据不合法这个就很诡异了。
你可以尝试下这样的方式,先通过datareader.readschematable拿到结果集的schema(一个datatable,其中每行就是返回结果集的每个字段的相关信息),然后根据这个信息手动构建一个datatable(手动把每个字段加到datatable的columns中去),然后循环datareader,通过最基础的dr.getvalue方式获取数据写到datarow中手工加到datatable,最后再返回出去。
@Daniel Cai: 我现在就是用的这种方式哦!
/// <summary>
/// 自定义将IDataReader转换为DataTable
/// </summary>
/// <param name="reader"></param>
/// <returns></returns>
public static void CustomLoadDataTable(DataTable dataTable, IDataReader reader)
{
int fieldCount = reader.FieldCount;
for (int i = 0; i < fieldCount; ++i)
{
dataTable.Columns.Add(reader.GetName(i), reader.GetFieldType(i));
}
dataTable.BeginLoadData();
object[] objValues = new object[fieldCount];
while (reader.Read())
{
reader.GetValues(objValues);
dataTable.LoadDataRow(objValues, true);
}
reader.Close();
dataTable.EndLoadData();
}
@Daniel Cai: 我现在出错的原因就是其中一个字段的数据类型为longtext,一旦改为varchar就正常了。这个确实有点让人费解哦。
@々孤星☆泪♂: 这个就不清楚了。不好意思。
@Daniel Cai: 我前两天突然发现并不是数据类型的原因,而是根改字段的字符长短有关。如果字段的字符数量在几百个以内就能够正常的转换,但是一旦上千个字符就会出现以上异常了哦