У меня есть этот код:
String testData = File.ReadAllText("siteQueryTest.txt");
XDocument xmlDoc = XDocument.Parse(testData);
List<SiteQuery> sitequeries =
(from sitequery in xmlDoc.Descendants("SiteQuery")
select new SiteQuery
{
Id = Convert.ToInt32(sitequery.Element("Id").Value),
UPCPackSize = Convert.ToInt32(sitequery.Element("UPCPackSize").Value),
UPC_Code = sitequery.Element("UPC_Code").Value,
crvId = sitequery.Element("crvId").Value,
dept = Convert.ToInt32(sitequery.Element("dept").Value),
description = sitequery.Element("description").Value,
openQty = Convert.ToDouble(sitequery.Element("openQty").Value),
packSize = Convert.ToInt32(sitequery.Element("packSize").Value),
subDept = Convert.ToInt32(sitequery.Element("subDept").Value),
unitCost = Convert.ToDecimal(sitequery.Element("unitCost").Value),
unitList = Convert.ToDecimal(sitequery.Element("unitList").Value),
vendorId = sitequery.Element("vendorId").Value,
vendorItem = sitequery.Element("vendorItem").Value,
}).ToList<SiteQuery>();
тестовые данные:
<SiteQueries><SiteQuery><Id>00006000002</Id><UPCPackSize>1</UPCPackSize><UPC_Code>00006000002</UPC_Code><crvId></crvId><dept>8</dept><description>ZZ</description><openQty>0.0</openQty><packSize>1</packSize><subDept>80</subDept><unitCost>1.25</unitCost><unitList>5.0</unitList><vendorId>CONFLICT</vendorId><vendorItem>123456</vendorItem></SiteQuery>
. . . // gazillions of other SiteQuery "records"
<SiteQuery><Id>5705654</Id><UPCPackSize>1</UPCPackSize><UPC_Code>5705654</UPC_Code><crvId></crvId><dept>2</dept><description>what do you want</description><openQty>0.0</openQty><packSize>1</packSize><subDept>0</subDept><unitCost>0.55</unitCost><unitList>1.62</unitList><vendorId></vendorId><vendorItem></vendorItem></SiteQuery></SiteQueries>
Но я получаю следующее исключение времени выполнения с этим кодом и данными:
System.OverflowException was unhandled
_HResult=-2146233066
_message=Value was either too large or too small for an Int32.
HResult=-2146233066
IsTransient=false
Message=Value was either too large or too small for an Int32.
Source=mscorlib
StackTrace:
at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
at System.Convert.ToInt32(String value)
at Sandbox.Form1.<button56_Click>b__e(XElement sitequery) in c:\HoldingTank\Sandbox\Form1.cs:line 2041
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
. . .
InnerException:
В каждой "записи" xml есть несколько значений int (4); есть тысячи записей. Как я могу, не пытаясь надеть шляпу Человека дождя (которая мне не очень подходит), определить, какое именно значение является проблематичным, вызывающим переполнение или недополнение?
Если это потеря значимости (в сообщении об исключении говорится как «OverflowException», так и «Значение было либо слишком большим, либо слишком маленьким для Int32», может ли это быть вызвано пустым значением для одного из этих четырех членов int? Если да, то как я могу сказать ему рассматривать пустое значение как 0?
It says:
c:\HoldingTank\Sandbox\Form1.cs:line 2041`, что это за строка? - person jessehouwing   schedule 07.01.2015Convert.ToInt32(sitequery.Element("foo").Value)
требует специального метода, который принимаетsitequery
иFoo
в качестве аргументов. Вы бы поймали преступника в мгновение ока. - person Wiktor Zychla   schedule 07.01.2015Id
есть первые цифры, я бы все равно использовал для негоstring
, иначе вы потеряете эти цифры. - person Matt Burland   schedule 07.01.2015Convert.Int32
строки. Раскомментируйте их один за другим, пока он снова не сломается. Определите, какое поле вызывает проблему сuint
(если оно все равно не может быть отрицательным) илиInt64
. Если у вас нет причин полагать, что один из элементов в вашем наборе данных неверен, поскольку он находится вне диапазона, вам все равно нужно обработать его, используя поле, достаточно большое для хранения значения. - person Matt Burland   schedule 07.01.2015