首页 新闻 搜索 专区 学院

C#中DataTable.Load(IDataReader reader)未能启用约束。一行或多行中包含违反非空、唯一或外键约束的值。

0
[已解决问题] 解决于 2016-12-01 20:58

从数据库读取数据后需要返回DataTable,其中一列的数据类型为LongText用于存储大量文本。现在用DataTable.Load(IDataReader reader)抛出异常“未能启用约束。一行或多行中包含违反非空、唯一或外键约束的值。”

请问怎么处理啊?

々孤星☆泪♂的主页 々孤星☆泪♂ | 初学一级 | 园豆:13
提问于:2016-11-28 23:18
< >
分享
最佳答案
0

dt.BeginLoadData();

dt.Load(reader);
    dt.Constraints.Clear();
    dt.EndLoadData();

试下

奖励园豆:5
Daniel Cai | 专家六级 |园豆:10424 | 2016-11-29 09:05

你好,这种方式还是不行的哦!!!

々孤星☆泪♂ | 园豆:13 (初学一级) | 2016-12-01 15:49

@々孤星☆泪♂: 如果这个不行的话,我也没太好办法,这些约束是从db中带出来的,db中数据不合法这个就很诡异了。

你可以尝试下这样的方式,先通过datareader.readschematable拿到结果集的schema(一个datatable,其中每行就是返回结果集的每个字段的相关信息),然后根据这个信息手动构建一个datatable(手动把每个字段加到datatable的columns中去),然后循环datareader,通过最基础的dr.getvalue方式获取数据写到datarow中手工加到datatable,最后再返回出去。

Daniel Cai | 园豆:10424 (专家六级) | 2016-12-01 16:12

@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();
}

々孤星☆泪♂ | 园豆:13 (初学一级) | 2016-12-01 16:38

@Daniel Cai: 我现在出错的原因就是其中一个字段的数据类型为longtext,一旦改为varchar就正常了。这个确实有点让人费解哦。

々孤星☆泪♂ | 园豆:13 (初学一级) | 2016-12-01 16:40

@々孤星☆泪♂: 这个就不清楚了。不好意思。

Daniel Cai | 园豆:10424 (专家六级) | 2016-12-01 17:12

@Daniel Cai: 我前两天突然发现并不是数据类型的原因,而是根改字段的字符长短有关。如果字段的字符数量在几百个以内就能够正常的转换,但是一旦上千个字符就会出现以上异常了哦

々孤星☆泪♂ | 园豆:13 (初学一级) | 2017-03-03 15:07
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册