2016-10-27 2 views
1

Я создал таблицу на SQL-сервере с столбцом OrderId как тип данных BigInt. Когда я сравниваю два datatables в C#, я получил следующую ошибку.Указанное внесение недействительно - C#

Указанного литая недопустимый

код ниже.

var idsNotInB = dt.AsEnumerable().Select(r => r.Field<long>("OrderId")) 
      .Except(dt1.AsEnumerable().Select(r => r.Field<long>("OrderId"))); 


    DataTable TableC = (from row in dt.AsEnumerable() 
         join OrderId in idsNotInB 
         on row.Field<long>("OrderId") equals (long)OrderId 
         select row).CopyToDataTable(); 

Пожалуйста, обратитесь к руководству, как справиться с этой ошибкой, заранее.

EDIT

Пожалуйста, смотрите изображение ниже. Я использовал bigint тип данных, и после него я пишу выше код C#.

enter image description here

+0

ли Столбец 'OrderId' в базе данных может быть недействительным? –

+0

Отладить и посмотреть, какой тип данных используется DataTable. Метод поля очень строгий. – Sebi

+0

Каков тип 'OrderId' в' ... equals (long) OrderId'? –

ответ

0

Похоже, метод Field<T> бросает InvalidCastException при попытке распаковывать значение из базовой таблицы базы данных. Не могли бы вы, пожалуйста, проверьте, если все значения в обеих таблицах Dt и dt1 являются конвертируемая долго:

dt     // check it also for dt1 
    .AsEnumerable() 
    .SelectMany(_ => _.ItemArray) 
    .Select(_ => new { Value = _, Type = _.GetType() }) 
    .Where(_ => _.Type != typeof(long)) 
    .ToList() 
    .ForEach(Console.WriteLine); 

Литт обходной путь от литья до object, а затем string может помочь в этом случае:

var idsNotInB = dt 
        .AsEnumerable() 
        .Select(_ => _.Field<object>("OrderId").ToString()) 
        .Except(dt1.AsEnumerable().Select(_ => _.Field<object>("OrderId").ToString())); 

DataTable TableC = dt 
        .AsEnumerable() 
        .Where(_ => idsNotInB.Contains(_.Field<object>("OrderId").ToString())) 
        .CopyToDataTable(); 
+0

Спасибо за ответ. Я проверяю оба dt, но не нашел ничего, кроме длинного типа данных в обоих «dt». Но, к счастью, ваш второй метод работает красиво. У меня мало вопросов: комфортно ли с типом и работать точной и быстрой, вместо того, чтобы использовать длинный тип данных? Большое спасибо :) –

+0

@RaufAbid Определенная скорость накладных расходов из-за преобразования строк и сравнения строк может иметь место, но результат должен быть точным. –

+0

Спасибо. Последний вопрос: как я могу рассчитывать: var idsNotInB. На самом деле спасибо .... –

0

Попытка бросить в long? вместо long. Это может произойти, если столбец обнуляемым в БД, как упоминалось MZetko failrly

Смежные вопросы