尝试种子数据库时索引超出范围

时间:2017-07-22 14:28:51

标签: c# entity-framework-6 httpwebrequest httpwebresponse

发生了什么:

我在运行Update-Database时尝试使用公司详细信息为我的数据库设定种子。但是,由于某些原因我无法理解,似乎我的Seed帮助方法中的代码在其中一个帮助程序返回null时忽略。

我在做什么:

这个想法很简单:

使用一堆标识符迭代文件并向API发送HttpWebRequest以使用标识符获取详细信息。然后解析对Company对象的响应。

但是,如果事实证明API中不存在其中一个标识符(如果是Request.StatusCode != HttpStatusCode.Ok),则返回null。或者如果周围的try-catch失败,我会返回null

我应该注意到,我知道我的列表中的第一个标识符会返回一个不正常的状态代码!

问题:

null永远不会被我的调用代码(下面的第一个片段)捕获,所以看起来它似乎正在尝试解析空的JObject,这给了我这个错误消息:< / p>

  

指数超出范围。必须是非负数且小于   集合。参数名称:index

致电代码:

string[] symbols = Resources.Fixed_lines.Split(' ');

int stockId = 1;

foreach(var symbol in symbols)
{
    var stockData = GetStockDataFromSymbol(symbol);

    if (stockData != null)
    {
        var json = JObject.Parse(stockData);

        var stock = new Company()
        {
            StockId = stockId,
            Name = json["datatable"]["data"][0][1].ToString(),
            Description = json["datatable"]["data"][0][0].ToString(),
            Symbol = symbol
        };

        _context.Stocks.Add(stock);
        stockId++;
    } else
    {
        continue;
    }
}
_context.SaveChanges();

HttpWebRequest帮助者:

private string GetStockDataFromSymbol(string symbol)
{
    try
    {
        string url = string.Format("https://www.quandl.com/api/v3/datatables/ZACKS/CP.json?" +
                "qopts.columns[]=comp_desc&qopts.columns[]=comp_name&ticker={0}" +
                "&api_key=myApiKey", symbol);
        Debug.WriteLine(url);
        HttpWebRequest request = (HttpWebRequest)WebRequest.
            Create(url);
        request.Method = "Get";
        request.KeepAlive = true;
        request.ContentType = "application/json";

        HttpWebResponse response = (HttpWebResponse)request.GetResponse();

        if (response.StatusCode != HttpStatusCode.OK)
        {
            return null;
        }

        string responseBody = string.Empty;
        using (System.IO.StreamReader sr = new System.IO.StreamReader(response.GetResponseStream()))
        {
            responseBody = sr.ReadToEnd();
        }

        return responseBody;
    }
    catch (Exception ex)
    {

        return null;
    }
}

0 个答案:

没有答案