首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >MySqlDataReader: DataTable.Fill(阅读器)抛出ConstraintException

MySqlDataReader: DataTable.Fill(阅读器)抛出ConstraintException
EN

Stack Overflow用户
提问于 2011-09-28 17:15:55
回答 6查看 23.3K关注 0票数 6

我有两张表ordersorderdetails

表orders (PK = id,orderno上的唯一索引)

代码语言:javascript
复制
|id|orderno|
| 1|1000   |
| 2|1001   |

表orderdetails (PK = id)

代码语言:javascript
复制
|id|orderid|item|qty|
| 1|      1|ABC |  3|
| 2|      1|XYZ |  4|

现在我想用以下命令查询数据:

代码语言:javascript
复制
SELECT o.orderno, od.item, od.qty
  FROM orders o

o.orderno = od.order上的内连接顺序详细信息od

它返回:

代码语言:javascript
复制
|orderno|item|qty|
|1000   |ABC |  3|
|1000   |XYZ |  4|

但是,如果我使用以下代码将结果加载到DataTable中,它将失败:

代码语言:javascript
复制
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

问题是,

代码语言:javascript
复制
table.Constraints[0]

是orderno列上的UniqueConstraints。可能是因为

代码语言:javascript
复制
reader.GetSchemaTable() 

有一个orderno的IsUnique=true条目(在基表中是真的,但在连接查询中不是真的)。

更糟糕的是,这也无济于事:

代码语言:javascript
复制
table.BeginLoadData(); // msdn docs claim that this should disable constraints
table.Load(reader);
table.EndLoadData();

有什么办法解决这个问题吗?

StackTrace:

代码语言:javascript
复制
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)
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-09-28 18:00:02

我刚想出来,

代码语言:javascript
复制
table.Fill(reader)

如果我已经添加了列,则不会创建约束。

所以我使用了一个很好的小扩展方法来修复这个问题:

代码语言:javascript
复制
    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);
    }

用法:

代码语言:javascript
复制
table.Fill(reader, true);
票数 7
EN

Stack Overflow用户

发布于 2013-02-21 00:20:32

我也有同样的问题,但通过使用这篇文章中的变通方法得到了解决:http://bugs.mysql.com/bug.php?id=65065 (在底部):

代码语言:javascript
复制
cmd.CommandText = "SELECT cam.no_serie, t.mnt FROM trx t LEFT JOIN camn cam USING(id_camn) ";
    MySqlDataReader dr = cmd.ExecuteReader();
    DataSet ds = new DataSet();
    DataTable dataTable = new DataTable();
    ds.Tables.Add(dataTable);
    ds.EnforceConstraints = false;
    dataTable.Load(dr);
    dr.Close();
票数 11
EN

Stack Overflow用户

发布于 2012-02-15 19:14:32

有一种简单而肮脏的方法来解决这个问题--使用concat函数在查询中用唯一约束包围列:

代码语言:javascript
复制
var commandText = "SELECT CONCAT(o.orderno, ''), od.item, od.qty ...";
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7580929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档