了MySqlDataReader:DataTable.Fill(阅读器)抛出ConstraintException [英] MySqlDataReader: DataTable.Fill(reader) throws ConstraintException
问题描述
我有两个表订单
和 ORDERDETAILS
订单表(PK = ID,在orderno UNIQUE指数)
| ID | orderno |
| 1 | 1000 |
| 2 | 1001 |
表ORDERDETAILS(PK = ID)
| ID |订单ID |项目|数量|
| 1 | 1 | ABC | 3 |
| 2 | 1 | XYZ | 4 |
现在我想对数据进行查询:
SELECT o.orderno,od.item,od.qty
FROM级O
INNER JOIN ORDERDETAILS OD ON o.orderno = od.order
返回:
| orderno |项目|数量|
| 1000 | ABC | 3 |
| 1000 | XYZ | 4 |
不过如果我使用下面的代码,结果装入失败的DataTable:
VAR的connectionString =服务器=本地主机;数据库=订单; UID =根;;
VAR的CommandText =SELECT o.orderno,od.item,od.qty+ Environment.NewLine +
从接单O+ Environment.NewLine +
INNER JOIN ORDERDETAILS OD ON o.orderno = od.order;
VAR读卡器= MySqlHelper.ExecuteReader(的connectionString,CommandText中);
无功表=新的DataTable(OrdersQuery);
table.Fill(读卡器); //抛出ConstraintException
的问题是,
table.Constraints [0]
是 UniqueConstraints
的orderno列。 Propably因为
reader.GetSchemaTable()
有一个 isUnique设置= TRUE
项orderno(这是真正的基表,但对于连接查询不是真的)。
更糟糕的是,这并没有帮助:
表。 BeginLoadData(); // MSDN文档声称这应该禁用限制
table.Load(读卡器);
table.EndLoadData();
任何想法如何解决这一问题?
堆栈跟踪:
System.Data.ConstraintException了未处理。
消息=未能启用约束。一行或多行中包含违反非空,唯一,或外键约束。
来源= System.Data这
堆栈跟踪:
贝System.Data.DataTable.EnableConstraints()
贝System.Data.DataTable.set_EnforceConstraints(布尔值)
贝System.Data.DataTable.EndLoadData()
贝System.Data.Common.DataAdapter.FillFromReader(DataSet的数据集,数据表的数据表,字符串srcTable要,DataReaderContainer DataReader的,的Int32 startRecord用于,的Int32最大记录,DataColumn的parentChapterColumn,对象parentChapterValue)
贝System.Data.Common.DataAdapter.Fill(数据表[]的DataTable,IDataReader的DataReader的,的Int32 startRecord用于,的Int32最大记录)
贝System.Data.Common.LoadAdapter.FillFromReader(数据表[]的DataTable,IDataReader的DataReader的, INT32 startRecord用于,INT32最大记录)
贝System.Data.DataTable.Load(IDataReader的读者,loadOption loadOption,FillErrorEventHandler的ErrorHandler)
贝System.Data.DataTable.Load(IDataReader的读者)
我只是想通了,那
table.Fill(阅读器)
不。创建约束,如果我已经添加了列
所以我用一个漂亮的小扩展方法解决了这个问题:
公共静态无效负载(此数据表的表,IDataReader的读者,布尔createColumns)
{
如果(createColumns)
{
table.Columns.Clear();
VAR schemaTable = reader.GetSchemaTable();
的foreach(DataRowView的行schemaTable.DefaultView)
{
VAR COLUMNNAME =(字符串)行[的ColumnName];
VAR类型=(类型)行[数据类型];
table.Columns.Add(COLUMNNAME,类型);
}
}
table.Load(读卡器);
}
用法:
table.Fill(读卡器,真);
I have two tables orders
and orderdetails
table orders (PK = id, UNIQUE index on orderno)
|id|orderno|
| 1|1000 |
| 2|1001 |
table orderdetails (PK = id)
|id|orderid|item|qty|
| 1| 1|ABC | 3|
| 2| 1|XYZ | 4|
Now I want to query the data with:
SELECT o.orderno, od.item, od.qty
FROM orders o
INNER JOIN orderdetails od ON o.orderno = od.order
which returns:
|orderno|item|qty|
|1000 |ABC | 3|
|1000 |XYZ | 4|
However If I use the following code to load the result into a DataTable it fails:
var connectionString = "Server=localhost;Database=orders;Uid=root;";
var commandText = "SELECT o.orderno, od.item, od.qty" + Environment.NewLine +
"FROM orders o" + Environment.NewLine +
"INNER JOIN orderdetails od ON o.orderno = od.order";
var reader = MySqlHelper.ExecuteReader(connectionString, commandText);
var table = new DataTable("OrdersQuery");
table.Fill(reader); // throws ConstraintException
The problem is, that
table.Constraints[0]
is a UniqueConstraints
on the orderno column. Propably because
reader.GetSchemaTable()
has a IsUnique=true
entry for orderno (which is true in the base table, but not true for the join query).
Even worse, that doesn't help either:
table.BeginLoadData(); // msdn docs claim that this should disable constraints
table.Load(reader);
table.EndLoadData();
Any ideas how to fix this?
StackTrace:
System.Data.ConstraintException Was Unhandled.
Message=Failed to enable constraints. One or more rows contain values violating non-null, unique, or foreign-key constraints.
Source=System.Data
StackTrace:
bei System.Data.DataTable.EnableConstraints()
bei System.Data.DataTable.set_EnforceConstraints(Boolean value)
bei System.Data.DataTable.EndLoadData()
bei System.Data.Common.DataAdapter.FillFromReader(DataSet dataset, DataTable datatable, String srcTable, DataReaderContainer dataReader, Int32 startRecord, Int32 maxRecords, DataColumn parentChapterColumn, Object parentChapterValue)
bei System.Data.Common.DataAdapter.Fill(DataTable[] dataTables, IDataReader dataReader, Int32 startRecord, Int32 maxRecords)
bei System.Data.Common.LoadAdapter.FillFromReader(DataTable[] dataTables, IDataReader dataReader, Int32 startRecord, Int32 maxRecords)
bei System.Data.DataTable.Load(IDataReader reader, LoadOption loadOption, FillErrorEventHandler errorHandler)
bei System.Data.DataTable.Load(IDataReader reader)
I just figured out, that
table.Fill(reader)
does not create the constraint, if I already added the columns.
So I fixed this by using a nice little extension method:
public static void Load(this DataTable table, IDataReader reader, bool createColumns)
{
if (createColumns)
{
table.Columns.Clear();
var schemaTable = reader.GetSchemaTable();
foreach (DataRowView row in schemaTable.DefaultView)
{
var columnName = (string)row["ColumnName"];
var type = (Type)row["DataType"];
table.Columns.Add(columnName, type);
}
}
table.Load(reader);
}
Usage:
table.Fill(reader, true);
这篇关于了MySqlDataReader:DataTable.Fill(阅读器)抛出ConstraintException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!