2013-08-01 34 views
1

我有一個應用程序,它以xml格式從YQL表yahoo.finance.quotes下載財務數據,然後將此數據寫入MS Access數據庫。我正在使用Jackcess與數據庫進行交互,但我在添加行時遇到了一個奇怪的問題。Jackcess列不按順序?

當我打電話給.addRow()所有的字段都被正確地寫入文件,除了少數被切換。這是我會下載和使用(與JAXB)的XML文件的例子...

<query xmlns:yahoo="http://www.yahooapis.com/v1/base.rng" yahoo:count="1" yahoo:created="2013-08-01T18:03:53Z" yahoo:lang="en-US"> 
    <results> 
    <quote> 
     <BookValue>236.698</BookValue> 
     <EarningsShare>34.565</EarningsShare> 
     <EPSEstimateCurrentYear>43.54</EPSEstimateCurrentYear> 
     <EPSEstimateNextYear>51.34</EPSEstimateNextYear> 
     <EPSEstimateNextQuarter>11.82</EPSEstimateNextQuarter> 
     <DaysLow>895.00</DaysLow> 
     <DaysHigh>903.07</DaysHigh> 
     <YearLow>623.41</YearLow> 
     <YearHigh>928.00</YearHigh> 
     <LastTradePriceOnly>901.83</LastTradePriceOnly> 
     <FiftydayMovingAverage>893.586</FiftydayMovingAverage> 
     <TwoHundreddayMovingAverage>856.999</TwoHundreddayMovingAverage> 
     <Open>895.67</Open> 
     <PreviousClose>887.75</PreviousClose> 
     <PriceSales>5.30</PriceSales> 
     <PriceBook>3.75</PriceBook> 
     <PERatio>25.68</PERatio> 
     <PEGRatio>1.41</PEGRatio> 
     <PriceEPSEstimateCurrentYear>20.39</PriceEPSEstimateCurrentYear> 
     <PriceEPSEstimateNextYear>17.29</PriceEPSEstimateNextYear> 
     <ShortRatio>1.90</ShortRatio> 
     <OneyrTargetPrice>985.32</OneyrTargetPrice> 
     <Volume>1460983</Volume> 
     <Ask>901.90</Ask> 
     <AverageDailyVolume>2330360</AverageDailyVolume> 
     <Bid>901.54</Bid> 
    </quote> 
    </results> 
</query> 
<!-- total: 222 --> 
<!-- engine4.yql.ne1.yahoo.com --> 

而這裏的結果訪問數據庫的XML導出...

<dataroot xmlns:od="urn:schemas-microsoft-com:officedata" generated="2013-08-01T13:28:55"> 
    <GOOG> 
    <ID>1375380249345</ID> 
    <BOOK_VALUE>901.9</BOOK_VALUE> 
    <EARNINGS_SHARE>3.75</EARNINGS_SHARE> 
    <EPS_ESTIMATE_CURRENT_YEAR>34.565</EPS_ESTIMATE_CURRENT_YEAR> 
    <ESP_ESTIMATE_NEXT_YEAR>43.54</ESP_ESTIMATE_NEXT_YEAR> 
    <EPS_ESTIMATE_NEXT_QUARTER>51.34</EPS_ESTIMATE_NEXT_QUARTER> 
    <DAYS_LOW>11.82</DAYS_LOW> 
    <DAYS_HIGH>895</DAYS_HIGH> 
    <YEAR_LOW>903.07</YEAR_LOW> 
    <YEAR_HIGH>623.41</YEAR_HIGH> 
    <LAST_TRADE_PRICE_ONLY>1.9</LAST_TRADE_PRICE_ONLY> <!-- Offending column --> 
    <FIFTYDAY_MOVING_AVERAGE>928</FIFTYDAY_MOVING_AVERAGE> 
    <TWO_HUNDREDDAY_MOVING_AVERAGE>901.83</TWO_HUNDREDDAY_MOVING_AVERAGE> 
    <OPEN>893.586</OPEN> 
    <PRICE_SALES>856.999</PRICE_SALES> 
    <PRICE_BOOK>895.67</PRICE_BOOK> 
    <PE_RATIO>5.3</PE_RATIO> 
    <PEG_RATIO>3.75</PEG_RATIO> 
    <PRICE_EPSESTIMATE_CURRENT_YEAR>25.68</PRICE_EPSESTIMATE_CURRENT_YEAR> 
    <PRICE_EPS_ESTIMATE_NEXT_YEAR>1.41</PRICE_EPS_ESTIMATE_NEXT_YEAR> 
    <ONEYR_TARGET_PRICE>985.32</ONEYR_TARGET_PRICE> 
    <SHORT_RATIO>1460983</SHORT_RATIO> <!-- Offending column --> 
    <VOLUME>2330360</VOLUME> <!-- Offending column --> 
    <ASK>20.39</ASK> 
    <AVERAGE_DAILY_VOLUME>901</AVERAGE_DAILY_VOLUME> <!-- Offending column --> 
    <BID>17.29</BID> 
    </GOOG> 
</dataroot> 

這裏是我的代碼從XML值添加到數據庫中,如果有幫助...

public synchronized void storeData(Query query) throws InterruptedException, IOException { 
    long idL = System.currentTimeMillis(); 
    BigDecimal id = new BigDecimal(idL); 
    double bookValue = query.results.quote.getPriceBook(); 
    double earningsShare = query.results.quote.getEarningsShare(); 
    double epsEstimateCurrentYear = query.results.quote.getEPSEstimateCurrentYear(); 
    double epsEstimateNextYear = query.results.quote.getEPSEstimateNextYear(); 
    double epsEstimateNextQuarter = query.results.quote.getEPSEstimateNextQuarter(); 
    double daysLow = query.results.quote.getDaysLow(); 
    double daysHigh = query.results.quote.getDaysHigh(); 
    double yearLow = query.results.quote.getYearLow(); 
    double yearHigh = query.results.quote.getYearHigh(); 
    double lastTradePriceOnly = query.results.quote.getLastTradePriceOnly(); 
    double fiftydayMovingAverage = query.results.quote.getFiftydayMovingAverage(); 
    double twoHundreddayMovingAverage = query.results.quote.getTwoHundreddayMovingAverage(); 
    double open = query.results.quote.getOpen(); 
    double priceSales = query.results.quote.getPriceSales(); 
    double priceBook = query.results.quote.getPriceBook(); 
    double peRatio = query.results.quote.getPERatio(); 
    double pegRatio = query.results.quote.getPEGRatio(); 
    double priceEPSEstimateCurrentYear = query.results.quote.getPriceEPSEstimateCurrentYear(); 
    double priceEPSEstimateNextYear = query.results.quote.getPriceEPSEstimateNextYear(); 
    double shortRatio = query.results.quote.getShortRatio(); 
    double oneyrTargetPrice = query.results.quote.getOneyrTargetPrice(); 
    int volume = query.results.quote.getVolume(); 
    double ask = query.results.quote.getAsk(); 
    int averageDailyVolume = query.results.quote.getAverageDailyVolume(); 
    double bid = query.results.quote.getBid(); 
    dBTable.addRow(id, bookValue, earningsShare, epsEstimateCurrentYear, epsEstimateNextYear, epsEstimateNextQuarter, daysLow, daysHigh, 
     yearLow, yearHigh, close, fiftydayMovingAverage, twoHundreddayMovingAverage, open, priceSales, priceBook, 
      peRatio, pegRatio, priceEPSEstimateCurrentYear, priceEPSEstimateNextYear, shortRatio, oneyrTargetPrice, volume, ask, averageDailyVolume, bid); 
} 

正如你所看到的只限於上次交易價格,短線比例,交易量爲平均日交易量爲左右。

有人能告訴我爲什麼這是,以及如何糾正它?謝謝。

回答

3

至少你的問題的一部分,似乎是在Jackcess的addRow()方法需要的值「中的表的列的順序」來提供,(強調他們的,參考:「添加一個行「部分here)。你addRow()調用指定

... shortRatio, oneyrTargetPrice, volume ... 

但Access表的XML轉儲表明列的順序是

<ONEYR_TARGET_PRICE>985.32</ONEYR_TARGET_PRICE> 
<SHORT_RATIO>1460983</SHORT_RATIO> <!-- Offending column --> 
<VOLUME>2330360</VOLUME> <!-- Offending column --> 

您可能還需要仔細檢查變量類型對列類型,以確保他們也匹配。