C# 大数据集上的“线程正在中止”

C# 大数据集上的“线程正在中止”,c#,database,C#,Database,我正在尝试处理从oracle数据库填充的数据集中的114000行。我在大约600马克处遇到一个错误-线程被中止。 我所做的只是读取数据集,但我仍然抓住了这个问题。对于数据集来说,这是否太多数据?不过,它似乎加载到数据集中了。我欢迎任何更好的方法来处理这一数量的数据 rootTermsTable = entKw.GetRootKeywordsByCategory(catID); for (int k = 0; k < rootTermsTable.Rows.Count; k++) {

我正在尝试处理从oracle数据库填充的数据集中的114000行。我在大约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;

    }

您的SqlCommand是否可能超时?尝试使用CommandTimeout属性查看这是否可能是原因:

com.CommandTimeout = 300; // sets a timeout to complete the command of five minutes

您的SqlCommand是否可能超时?尝试使用CommandTimeout属性查看这是否可能是原因:

com.CommandTimeout = 300; // sets a timeout to complete the command of five minutes

首先,通过在查询中不使用select*来减少获得的数据量。指定表中实际需要的字段。至少不需要一个字段,因为您已经知道它的值


您可以使用DataReader,而不是使用DataTable。这样,您就可以逐个处理记录,这样就不必一次将所有记录存入内存。

首先,通过在查询中不使用select*来减少数据量。指定表中实际需要的字段。至少不需要一个字段,因为您已经知道它的值

您可以使用DataReader,而不是使用DataTable。这样,您就可以逐个处理记录,这样您就不必一次将所有记录存入内存。

一些想法:

根据您的操作,DataReader可能比DataTable快。DataReader允许您在从数据库读取数据时一次处理一行。如果您正在对每一行进行相当多的处理,那么您当前的方法DataTable可能是更好的方法,因为它允许您将所有行拉入内存并处理它们,而无需保持连接打开。 考虑选择IKYBDKEY,而不是选择*,因为您将通过导线拉回较少的数据并进入内存。 最后,您可以在代码周围放置try/catch,以确保它是错误消息的实际来源。如果您使用的是ASP.Net,线程被中止是一个非常常见的错误,它通常表示处理请求被中断,例如,有人导航远离长时间运行的请求。 一些想法:

根据您的操作,DataReader可能比DataTable快。DataReader允许您在从数据库读取数据时一次处理一行。如果您正在对每一行进行相当多的处理,那么您当前的方法DataTable可能是更好的方法,因为它允许您将所有行拉入内存并处理它们,而无需保持连接打开。 考虑选择IKYBDKEY,而不是选择*,因为您将通过导线拉回较少的数据并进入内存。 最后,您可以在代码周围放置try/catch,以确保它是错误消息的实际来源。如果您使用的是ASP.Net,线程被中止是一个非常常见的错误,它通常表示处理请求被中断,例如,有人导航远离长时间运行的请求。
让我问一下。。。。这不是内存问题吗?您使用的是“异步”委托还是“BackgroundWorker”?我在使用“异步”委托时遇到了一些内存问题,最终切换到了BGW。但我怀疑600行是否会导致记忆受损。让我问一下。。。。这不是内存问题吗?您使用的是“异步”委托还是“BackgroundWorker”?我在使用“异步”委托时遇到了一些内存问题,最终切换到了BGW。但我怀疑600行是否会导致记忆受损。谢谢菲尔。它正在ASP.NET进程SharePoint web部件中运行。我要重建为控制台应用程序,看看我是否仍然得到这个问题。谢谢菲尔。它正在ASP.NET进程SharePoint web部件中运行。我要重建为控制台应用程序,看看我是否仍然得到的问题。