У меня есть две таблицы orders
и orderdetails
таблицы заказов (PK = идентификатор, уникальный индекс по номеру заказа)
|id|orderno|
| 1|1000 |
| 2|1001 |
таблицы OrderDtails (PK = идентификатор)
|id|orderid|item|qty|
| 1| 1|ABC | 3|
| 2| 1|XYZ | 4|
Теперь я хочу запросить данные с помощью:
SELECT o.orderno, od.item, od.qty
FROM orders o
ВНУТРЕННЕЕ ПОДКЛЮЧЕНИЕ OrderDetails od ON o.orderno = od.order
, который возвращает:
|orderno|item|qty|
|1000 |ABC | 3|
|1000 |XYZ | 4|
Однако, если я использую следующий код для загрузки результата в DataTable, он завершается ошибкой:
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
Проблема в том, что
table.Constraints[0]
представляет собой UniqueConstraints
на столбце заказа.Вероятно потому, что
reader.GetSchemaTable()
имеет запись IsUnique=true
для orderno (что верно в базовой таблице, но не верно для запроса на соединение).
Еще хуже, это не такПомогите либо:
table.BeginLoadData(); // msdn docs claim that this should disable constraints
table.Load(reader);
table.EndLoadData();
Есть идеи как это исправить?
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)