«Поток был прерван» 0n большой набор данных - PullRequest
2 голосов
/ 13 марта 2010

Я пытаюсь обработать 114 000 строк в наборе данных (заполненном из базы данных оракула). Я получаю сообщение об ошибке около 600 - «Поток был прерван».
Все, что я делаю, это читаю набор данных, и я все еще сталкиваюсь с проблемой. Это слишком много данных для набора данных? Кажется, что загрузка в набор данных в порядке, хотя. Я приветствую любые лучшие способы обработки этого количества данных.

rootTermsTable = entKw.GetRootKeywordsByCategory(catID);
for (int k = 0; k < rootTermsTable.Rows.Count; k++)
{
    string keywordID = rootTermsTable.Rows[k]["IK_DBKEY"].ToString();
    ...
}


public DataTable GetKeywordsByCategory(string categoryID)
    {
        DbProviderFactory provider = DbProviderFactories.GetFactory(connectionProvider);
        DbConnection con = provider.CreateConnection();
        con.ConnectionString = connectionString;

        DbCommand com = provider.CreateCommand();
        com.Connection = con;
        com.CommandText = string.Format("Select * From icm_keyword WHERE (IK_IC_DBKEY = {0})",categoryID);
        com.CommandType = CommandType.Text;

        DataSet ds = new DataSet();
        DbDataAdapter ad = provider.CreateDataAdapter();
        ad.SelectCommand = com;

        con.Open();
        ad.Fill(ds);
        con.Close();

        DataTable dt = new DataTable();
        dt = ds.Tables[0];

        return dt;

        //return ds.Tables[0].DefaultView;

    }

Ответы [ 3 ]

0 голосов
/ 13 марта 2010

Во-первых, уменьшите количество данных, которые вы получаете, не используя select * в запросе. Укажите, какие поля вам действительно нужны из таблицы. По крайней мере, одно поле вообще не нужно, поскольку вы уже знаете, что это значение.

Вместо DataTable вы можете использовать DataReader. Таким образом, вы можете обрабатывать записи одну за другой, чтобы вам не нужно было сразу записывать все записи в память.

0 голосов
/ 13 марта 2010

Несколько мыслей:

  1. В зависимости от того, что вы делаете, DataReader может работать быстрее, чем DataTable. DataReader позволяет обрабатывать по одной строке за раз, когда она читается из базы данных. Если вы выполняете значительную часть обработки каждой строки, то ваш текущий метод (DataTable), вероятно, является лучшим подходом, поскольку он позволяет извлекать все строки в память и обрабатывать их, не оставляя соединения открытым.
  2. Рассмотрим «SELECT IK_DBKEY» вместо «SELECT *», так как вы будете извлекать меньше данных по проводам в память.
  3. Наконец, вы можете попробовать / поймать код, чтобы убедиться, что он является реальным источником сообщения об ошибке. Если вы используете ASP.Net, «Поток был прерван» - довольно распространенная ошибка, которая обычно указывает на то, что запрос на обработку был прерван (например, кто-то отклонился от долгосрочного запроса).
0 голосов
/ 13 марта 2010

Возможно, ваше SqlCommand истекло? Попробуйте поэкспериментировать со свойством CommandTimeout, чтобы выяснить, не является ли это причиной:

com.CommandTimeout = 300; // sets a timeout to complete the command of five minutes
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...