Получение исключения из ограничений при загрузке DataReader в DataTable

Я запускаю запрос на слияние с базой данных 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 - Не удалось включить ограничения. Одна или несколько строк содержат значения, нарушающие ненулевые, уникальные ограничения или ограничения внешнего ключа.

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

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

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

5 ответов

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

 Try

 TempDataTable.Load(PrimaryCommand.ExecuteReader)

Catch ex As ConstraintException

  End Try

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

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

Кажется, чтобы помочь.

лайк

Select * from
(Select columnB,columnB ) -- if your table is being created on the fly.

Нарушение ненулевых, уникальных или внешних ключей.

non-null: проверьте, возвращают ли некоторые поля (поля) значение null и разрешено ли значение NULL для поля.

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

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

Положил dt.BeginLoadData() перед звонком на Load.

 dt.BeginLoadData();
 dt.Load(dbReader);
 dt.EndLoadData();
Другие вопросы по тегам