これは私を狂わせており、なぜこのエラーがスローされているのかわかりません。
これが私の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();
}