簡體   English   中英

已經有一個開放的datareader-Mysql-C#我處理連接

[英]There is already an open datareader - Mysql - C# I dispose of connection

這使我發瘋,我不知道為什么會引發此錯誤。

這是我的Program.cs

MySQLProcessor.Connection = MySQLProcessor.OpenCon();
        MySQLProcessor.ThreadingConnection = MySQLProcessor.OpenCon();
        DataTable All_Websites_DataTable =  MySQLProcessor.DTTable("select BaseURL,subURL from CouponExtractor.tblUrls where GroceryStoreBit = b'0'",MySQLProcessor.Connection);
        MySQLProcessor.Connection.Dispose();
Semaphore _pool = new Semaphore(1, 50);
        Parallel.ForEach(All_Websites_DataTable.AsEnumerable(), website_DataRow =>
        {
            _pool.WaitOne();
            //additional_subURL is used to crawl threw additional URLs until unqiue value is hit
            int additional_subURL = 0;
            Catch_Old_Values = false;

            string baseURL = All_Websites_DataTable.ItemArray[0].ToString();
            string subURL = All_Websites_DataTable.ItemArray[1].ToString();
            string complete_url = string.Empty;

            //need a bool to check homepage without crawling subpages
            bool check_homepage = true;
            complete_url = baseURL + "/" + subURL.Replace("@", additional_subURL.ToString());
            string mysqlquery_siteprocesslog = "insert into tbllogs(message,timestampcolumn) Values('Processing: " + complete_url + "',Now())";
            MySQLProcessor.MySQLInsertUpdate(mysqlquery_siteprocesslog,MySQLProcessor.ThreadingConnection);

            //as long as catch_old_values is false, the app will continue crawling the website until it hits an old value
            while (Catch_Old_Values == false)
            {
                additional_subURL++;


                if (additional_subURL >= 7)
                {
                    Catch_Old_Values = true;
                    break;
                }
                else if (check_homepage == true)
                {
                    //set check_homepage to false because we will crawl the homepage and dont want to do it again.
                    check_homepage = false;
                    SiteProcessing.ProcessSite(baseURL, baseURL);


                }
                else
                {
                    complete_url = baseURL + "/" + subURL.Replace("@", additional_subURL.ToString());
                    SiteProcessing.ProcessSite(complete_url, baseURL);
                }

            }
            _pool.Release();
        });

為了方便起見,這是SiteProcessing唯一訪問MysqlProcessor的部分

 if (hotitem == true)
                    {
                        string mysqlquery_InserthotResults = "insert into couponextractor." + targetTable + " (BaseURL,Description,realURL,TimeStampcolumn,uniqueKey,hotkey) Values ('" + baseURL + "','" + description.Replace("'", "") + "','" + realURL + "',Now(),'" + uniqueKey.Replace("'", "") + "','" + hotitemkey + "')";
                        MySQLProcessor.MySQLInsertUpdate(mysqlquery_InserthotResults, MySQLProcessor.ThreadingConnection);
                    }
                    else
                    {
                        string mysqlquery_InsertResults = "insert into couponextractor." + targetTable + " (BaseURL,Description,realURL,TimeStampcolumn,uniqueKey) Values ('" + baseURL + "','" + description.Replace("'", "") + "','" + realURL + "',Now(),'" + uniqueKey.Replace("'", "") + "')";
                        MySQLProcessor.MySQLInsertUpdate(mysqlquery_InsertResults, MySQLProcessor.ThreadingConnection);
                    }

這是Mysqlprocessor

public static MySqlConnection Connection { get; set; }
    public static MySqlConnection ThreadingConnection { get; set; }
    public static MySqlConnection OpenCon()
    {
        MySqlConnection masterOpenCON = new MySqlConnection("removed for privacy");
        masterOpenCON.Open();
        return masterOpenCON;
    }

    public static DataTable DTTable(string mysqlQuery, MySqlConnection MysqlCon)
    {
        DataTable DTTableTable = new DataTable();
        using (MysqlCon)
        {
            using (MySqlDataAdapter DataDTTables = new MySqlDataAdapter(mysqlQuery, MysqlCon))
            {
                DataDTTables.SelectCommand.CommandTimeout = 2500;
                using (DataTable DataDTTablesDT = new DataTable())
                {
                    DataDTTables.Fill(DataDTTablesDT);
                    DTTableTable = DataDTTablesDT;
                    DataDTTablesDT.Dispose();
                }

            }
        }

        return DTTableTable;
    }

    public static void MySQLInsertUpdate(string MySQLCommand, MySqlConnection MysqlCon)
    {
        try
        {
            using (MysqlCon)
            {
                MySqlCommand MySQLCommandFunc = new MySqlCommand(MySQLCommand, MysqlCon);
                MySQLCommandFunc.CommandTimeout = 2500;
                MySQLCommandFunc.ExecuteNonQuery();
            }
        }
        catch (Exception ex)
        {
            if (ex.Message.ToString().Contains("Duplicate entry"))
            {
                //SiteController.Catch_Old_Values = true;
            }
            else if (ex.Message.ToString().Contains("Data too long for column"))
            {


            }
            else
            {
                EventLog.WriteEntry("CouponCrawler", ex.Message.ToString(), EventLogEntryType.Error);
            }
        }
    }

我很困惑,在進入Threading之前,我很清楚在Program.CS中處理了MySQLProcessor.Connection。 然后,我再也不會在應用程序的其余部分中調用數據讀取器。 歡迎任何幫助,我會發瘋..

這里拋出異常:

using (MysqlCon)
            {
                MySqlCommand MySQLCommandFunc = new MySqlCommand(MySQLCommand, MysqlCon);
                MySQLCommandFunc.CommandTimeout = 2500;
                MySQLCommandFunc.ExecuteNonQuery();
            }

一旦執行離開了using語句的主體,“ using”語句將處置該對象。 在foreach循環中,您將在第一次調用MySQLInsertUpdate時處理連接。

同樣(以及產生異常的原因)是,通過執行並行foreach,您將在同一連接上同時執行兩個查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM