已经有一个开放的datareader - Mysql - C#I处理连接

时间:2012-06-27 01:18:16

标签: c# mysql

这个让我疯了,我无法弄清楚为什么会抛出这个错误。

这是我的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();
        });

对于帖子的长度,这里是访问MysqlProcessor

的SiteProcessing的唯一部分
 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);
            }
        }
    }

我很困惑,我甚至在进入线程之前在Program.CS中清楚地处理了MySQLProcessor.Connection。然后我从不在应用程序的其余部分调用datareader。欢迎任何帮助我疯了......

此处抛出异常:

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

1 个答案:

答案 0 :(得分:0)

一旦执行离开using语句的主体,'using'语句将处理该对象。在你的foreach循环中,你将在第一次调用MySQLInsertUpdate时处理你的连接。

此外(以及您的例外原因)是,通过执行并行foreach,您将在同一连接上同时执行两个查询。