[英]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.