这个让我疯了,我无法弄清楚为什么会抛出这个错误。
这是我的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();
}
答案 0 :(得分:0)
一旦执行离开using语句的主体,'using'语句将处理该对象。在你的foreach循环中,你将在第一次调用MySQLInsertUpdate时处理你的连接。
此外(以及您的例外原因)是,通过执行并行foreach,您将在同一连接上同时执行两个查询。