2016-01-10 2 views
5

Я звоню в хранимую процедуру MySQL, которая должна возвращать около 6000 строк. Но он возвращает только последнюю строку. Посмотрев на это, я не могу понять, почему он вернет только последнюю строку информации.MySQL хранимая процедура возвращает только последнюю строку данных

C# Код

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using MySql.Data.MySqlClient; 
using System.Net; 
using FileHelpers; 
using Stockton; 
using System.IO; 

namespace MassHistoricalDownload 
{ 
    class Program 
    { 

     MySqlConnection conn = new MySqlConnection(); 
     Reference r = new Reference(); 

     static void Main(string[] args) 
     { 
      Program p = new Program(); 
      p.DownloadHistoricData(); 
     } 

     public void DownloadHistoricData() 
     { 
      conn.ConnectionString = r.getMysqlConnection(); 
      string historicalDataPath = r.getHistFileLocation(); 
      string historicalDataExtension = ".csv"; 

      //Get the list of ticker symbols as well as the last date for which historical data was downloaded for that stock 
      conn.Open(); 
      MySqlCommand myCommand = new MySqlCommand("call stockton.pullHistSymbolAndDate()", conn); 
      MySqlDataReader rdr = myCommand.ExecuteReader(); 

      //Download the files into the HistoricalData file 
      while (rdr.Read()) 
      { 
       string stockSymbol = rdr["symbol"].ToString(); 
       string stockLastDate = rdr["histDate"].ToString(); 

       //Check if the stockLastDate is empty and put int the oldest date if it is 
       if (stockLastDate == null || stockLastDate == string.Empty) 
        stockLastDate = r.getOldestTradeDate().ToString(); 

       using (WebClient client = new WebClient()) 
       { 
        using (StreamWriter sw = File.AppendText(Path.Combine(historicalDataPath, stockSymbol + historicalDataExtension))) 
        { 

         sw.Write(client.DownloadString(string.Format(r.getYahooDownloadPart(), stockSymbol, stockLastDate))); 
        } 
       } 
      } 
      conn.Close(); 
     } 
    } 

    [IgnoreFirst(1)] 
    [DelimitedRecord(",")] 
    public class HistoricalStock 
    { 
     public string infoDate { get; set; } 
     public double stockOpen { get; set; } 
     public double stockHigh { get; set; } 
     public double stockLow { get; set; } 
     public double stockClose { get; set; } 
     public int stockVolume { get; set; } 
     public double adjClose { get; set; } 
    } 
} 

MySQL хранимой процедуры

CREATE DEFINER=`meggleston`@`%` PROCEDURE `pullHistSymbolAndDate`() 
BEGIN 
select 
    c.symbol, 
    hd.histDate 
from 
    company c 
    left join historical_data hd on 
     hd.symbol = c.symbol 
     and 
     hd.histDate = (select max(histDate) from historical_data where symbol = c.symbol); 
END 
+0

Ваш 'ЛЕВЫЙ JOIN' заявление, вероятно, проблема. Разве предикат 'hd.histDate' не должен находиться под его собственным предложением WHERE? Вместо критериев' JOIN'? – Dai

+1

Что произойдет, если вы запустите запрос напрямую (вне sproc), в MySQL Workbench? – Dai

+0

Он отлично работает в workbench MySQL. –

ответ

0

Вы могли бы упростить SQL, как:

select 
    c.symbol, 
    max(hd.histDate) as histDate 
from 
    company c 
    left join historical_data hd on hd.symbol = c.symbol 
    group by c.symbol 

Это определенно вернет все символы из таблицы компании вместе с их последний histDate.

EDIT

В вашем C# в то время как петли вы держите перезапись stockSymbol и stockLastUpdate переменные. Их значение будет последним значением записи в конце цикла. Возможно, вы хотите сохранить возвращаемые значения в массиве или списке.

+0

Это, безусловно, улучшение в sql-запросе. Но исходная проблема существует там, где возвращается только последняя строка. –

+0

См. Мои изменения в ответе. – Shadow

+0

Они хранятся в списке. Читатель должен действовать как список, который я повторяю и сохраняю данные до тех пор, пока это не понадобится. Исправьте меня, если я ошибаюсь. –

0

Попробуйте добавить myCommand.CommandType = CommandType.StoredProcedure;

+0

Это дает ошибку в команде ExecuteReader. –

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