King Fisher Ответов: 4

Как Мне Решить": Система.Которого вызывается invalidcastexception: заданное приведение является недопустимым" в LINQ в C#


Я пытаюсь выбрать запись, где branchid=1 из DataTable, используя Linq C#

мой код:
DataSet ds = new DataSet();
ds = obj.Bind(); //from database
 DataSet ds1 = new DataSet();
 DataTable dt = ds.Tables[0];
 IEnumerable<DataRow> query = from element in dt.AsEnumerable()

                                   select element;

  IEnumerable<DataRow> query1 = query.Where(p => p.Field<int>("branchid") == 1);//error
  DataTable dt1 = query1.CopyToDataTable<DataRow>();
  ds1.Tables.Add(dt1);


От этого я получаю эту ошибку
": System.InvalidCastException: Specified cast is not valid."

DamithSL

что такое ваша база данных,какой тип столбца?

King Fisher

тип данных столбца-bigint .

Matt T Heffron

T-SQL bigint соответствует типу c# long (Int64)
NOT int (Int32)

King Fisher

можете ли вы сказать мне, если поплавок?

Matt T Heffron

Я не понимаю вашего вопроса.
http://msdn.microsoft.com/en-us/library/ms187752.aspx документирует все типы данных T-SQL.
C# "float" - это "реальный" (или " float(24)") в T-SQL

Vedat Ozan Oner

почему вы не используете типизированные наборы данных? вы получаете такие головные боли только из-за того, что не кодируете типобезопасным способом. у вас есть конструктор наборов данных в IDE, который делает вашу жизнь лучше, безопаснее, проще, и вы им не пользуетесь. Я действительно не могу понять.

Maciej Los

Это может быть глупо, но попробуйте очистить и перестроить свой проект (решение) ;)

Ajith K Gatty

вовсе нет!! иногда мне приходится делать то же самое, когда я работаю над элементами управления telerik...: p

4 Ответов

Рейтинг:
22

DamithSL

добавьте нижеприведенную строку и проверьте, какой тип вы получаете в качестве типа данных

var type = dt.Columns["branchid"].DataType;

вам нужно привести столбец к вышеуказанному типу. Вы говорите это как int в базе данных, но в вашем наборе данных это может быть один из следующих вариантов
Int16
Int32
Int64
SByte
Single
UInt16
UInt32
UInt64

Лучше вам отладить и подтвердить тип данных.

как в ваших комментариях
Цитата:
тип данных столбца-bigint .

попробуйте с Int64
IEnumerable<DataRow> query1 = query.Where(p => p.Field<Int64>("branchid") == 1);


Ajith K Gatty

Хорошее объяснение...

King Fisher

спасибо, что он работает .я использовал Int64. большое спасибо. :)

DamithSL

добро пожаловать!

Snesh Prajapati

Абсолютный ответ..Спасибо

Рейтинг:
2

Maciej Los

Попробовать это:

IEnumerable<DataRow> query = from element in dt.AsEnumerable()
                             where(element.Field<int>("branchid") == 1)
                             select new
                             {
                                 Field1 = element.Field<int>("branchid"),
                                 Field2 = element.Field<type>("otherfield")
                             };

Помните: C# чувствителен к регистру!
branchid это не то же самое, что BranchId.

И... Пожалуйста, прочтите мой комментарий к этому вопросу ;)


King Fisher

спасибо.решение 2 работает. ;)

Рейтинг:
1

Bernhard Hiller

"branchid" либо
- не инт
- нулевой.


King Fisher

Спасибо за ответ ,
Branchid datatype - это Int в моей базе данных,и ни один из Столбцов Integer Datatype не работает, сэр, он выдает ту же ошибку.
но если я использую любой столбец Varchar, то он работает.
:(

Bernhard Hiller

Затем: потому что значение равно нулю.

King Fisher

в столбце sir нет нулевого значения ,и он говорит о той же ошибке, когда я также использую столбец datetime datatype.

Matt T Heffron

Является ли столбец branchid нулевым?
Вы пробовали p. Field< int?> ("branchid")
 
В любом случае оператор linq, который назначает запрос, бессмыслен, просто используйте dt.AsEnumerable (), где у вас есть запрос.

King Fisher

взгляните на мой код, сэр?
Я что-нибудь пропустил?

Рейтинг:
0

alfredolopez1234

IEnumerable & lt;datarow>query1 = запрос.Где (p => p. поле ("branchid").ToString == "1")