Получение исключения из ограничений при загрузке DataReader в DataTable - PullRequest
1 голос
/ 18 октября 2011

Я выполняю запрос на слияние с базой данных SQL2008, которая возвращает выходные данные слияния, используя следующий код c #:

cmd.CommandText = query;
if (conn.DBConn.State == ConnectionState.Closed) conn.DBConn.Open();
DbDataReader dbReader = cmd.ExecuteReader();
DataTable dt = new DataTable("Results");
dt.Load(dbReader);

Последняя строка выдает ошибку:

System.Data.ConstraintException - Не удалось включить ограничения.Одна или несколько строк содержат значения, нарушающие ограничения ненулевого, уникального или внешнего ключа.

Я обнаружил this в MSDN, и это соответствует моему сценарию, но как мнена самом деле это исправить?

Очистка первичного ключа с помощью dt.PrimaryKey=null; не работает

Приведенный выше код будет использоваться для многих таблиц.

Ответы [ 5 ]

2 голосов
/ 14 июня 2017

Самый простой обходной путь, который я нашел для этой ошибки, состоит в том, чтобы просто обернуть ее в блоке Catch и игнорировать ошибку. Я обнаружил это во время реализации превосходной статьи cjb110 о поиске дополнительной информации об ошибках ограничения. К моему удивлению, я совершенно случайно узнал, что мы можем полностью игнорировать ошибку и использовать данные как есть. Я убедился, что приведенный ниже код VB (не стесняйтесь запускать его через преобразователь кода для синтаксиса C #) возвращает все строки и столбцы, как и ожидалось, по крайней мере в тех случаях, когда я столкнулся с проблемой (которая в моем случае был в основном на объектах команды ADOMD).

 Try

 TempDataTable.Load(PrimaryCommand.ExecuteReader)

Catch ex As ConstraintException

  End Try

Обратите внимание, что этот вопрос является вероятной копией нового потока. DataTable.Load, Одна или несколько строк содержат значения, отличные от NULL

1 голос
/ 10 февраля 2012

Сделай это. Поместите select output в качестве производной таблицы и select * из производной.

Кажется, это помогает.

как

Select * from
(Select columnB,columnB ) -- if your table is being created on the fly.
0 голосов
/ 06 ноября 2013

Поставьте dt.BeginLoadData() перед вызовом Load.

 dt.BeginLoadData();
 dt.Load(dbReader);
 dt.EndLoadData();
0 голосов
/ 19 октября 2011

нарушение ограничений, не равных NULL, уникальному или внешнему ключу.

NULL: проверьте, возвращаются ли некоторые из полей, возвращающие значение NULL, и допустимо ли значение NULL для этого поля.

уникальный: кажется подтвержденным

0 голосов
/ 18 октября 2011

Может быть, ваш запрос возвращает несколько наборов результатов? Запустите ваш запрос в Management Studio или аналогичном, чтобы увидеть.

...