了MySqlDataReader:DataTable.Fill(阅读器)抛出ConstraintException [英] MySqlDataReader: DataTable.Fill(reader) throws ConstraintException

查看:349
本文介绍了了MySqlDataReader:DataTable.Fill(阅读器)抛出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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆