ببینید یک تابع به این صورت دارم :
public void CheckDatabaseForTasks()
{
while (true)
{
Thread.Sleep(15000);
SqlConnection connection = new SqlConnection(Assist.connectionString);
SqlDataReader rdr = null;
string Server = "", Account = "", Password = "";
try
{
connection.Open();
SqlCommand cmd = new SqlCommand("select * from UpgradeQueue where dateend < convert(datetime,'" + DateTime.Now + "',121)", connection);
cmd.CommandTimeout = 0;
rdr = cmd.ExecuteReader();
while (rdr.Read())
{
//MessageBox.Show(rdr[1].ToString(), "rdr 111111111");
Server = rdr[0].ToString();
Account = rdr[1].ToString();
Password = rdr[2].ToString();
int TaskType = Convert.ToInt32(rdr[5]);
if (TaskType == 10000)
{
// timer logout start
}
else if (TaskType == 2222)
TaskType = 2;
else if (TaskType == 3333)
TaskType = 3;
else if (TaskType == 4444)
TaskType = 4;
else if (TaskType == 5555)
TaskType = 5;
else
TaskType = 1;
if (TaskType != 10000)
upg_db(Server, Account, Password, TaskType);
else
logout(Server, Account, Password, TaskType);
}
if (rdr != null)
rdr.Close();
}
catch (Exception ex) { MessageBox.Show(ex.Message, "22ww"); }
finally
{
if (rdr != null)
rdr.Close();
if (connection != null)
connection.Close();
}
}
}
و دو تا تابع استفاده شده در داخل این تابع :
public void logout(string server, string account, string password, int TaskType)
{
DateTime T = DateTime.Now;
int TimeLogouted = rnd.Next(60, 100);// dagige
int TimeLoginAgain = TimeLogouted + rnd.Next(360, 600);//dagige
SqlConnection connection = new SqlConnection(Assist.connectionString);
SqlDataReader rdr = null;
String query = "";
int cookieid = 0;
try
{
connection.Open();
query = "select * from LoginParameters where server='" + server + "' and account='" + account + "'";
SqlCommand cmd2 = new SqlCommand(query, connection);
cmd2.CommandTimeout = 0;
rdr = cmd2.ExecuteReader();
while (rdr.Read())
{
cookieid = Convert.ToInt32(rdr[8].ToString());
Cookies[cookieid] = new CookieContainer();
break;
}
if (rdr != null)
{
rdr.Close();
}
query = "DELETE FROM UpgradeQueue where server='" + server + "' and account='" + account + "'";
SqlCommand command = new SqlCommand(query, connection);
command.ExecuteNonQuery();
query = "INSERT INTO UpgradeQueue (server,account,password,datecreated,dateend,taski d) VALUES(@server,@account, @password,@datecreated,@dateend,@taskid)";
command = new SqlCommand(query, connection);
command.CommandTimeout = 0;
command.Parameters.Add("@server", server);
command.Parameters.Add("@account", account);
command.Parameters.Add("@password", password);
command.Parameters.Add("@datecreated", T);
command.Parameters.Add("@dateend", T.AddMinutes(TimeLogouted));
command.Parameters.Add("@taskid", 1); // main
command.ExecuteNonQuery();
query = "INSERT INTO UpgradeQueue (server,account,password,datecreated,dateend,taski d) VALUES(@server,@account, @password,@datecreated,@dateend,@taskid)";
command = new SqlCommand(query, connection);
command.CommandTimeout = 0;
command.Parameters.Add("@server", server);
command.Parameters.Add("@account", account);
command.Parameters.Add("@password", password);
command.Parameters.Add("@datecreated", T);
command.Parameters.Add("@dateend", T.AddMinutes(TimeLogouted).AddSeconds(rnd.Next(300 , 400)));
command.Parameters.Add("@taskid", 2222); // traintroop
command.ExecuteNonQuery();
query = "INSERT INTO UpgradeQueue (server,account,password,datecreated,dateend,taski d) VALUES(@server,@account, @password,@datecreated,@dateend,@taskid)";
command = new SqlCommand(query, connection);
command.CommandTimeout = 0;
command.Parameters.Add("@server", server);
command.Parameters.Add("@account", account);
command.Parameters.Add("@password", password);
command.Parameters.Add("@datecreated", T);
command.Parameters.Add("@dateend", T.AddMinutes(TimeLogouted).AddSeconds(rnd.Next(180 0, 3600)));
command.Parameters.Add("@taskid", 3333); // seninf
command.ExecuteNonQuery();
query = "INSERT INTO UpgradeQueue (server,account,password,datecreated,dateend,taski d) VALUES(@server,@account, @password,@datecreated,@dateend,@taskid)";
command = new SqlCommand(query, connection);
command.CommandTimeout = 0;
command.Parameters.Add("@server", server);
command.Parameters.Add("@account", account);
command.Parameters.Add("@password", password);
command.Parameters.Add("@datecreated", T);
command.Parameters.Add("@dateend", T.AddMinutes(TimeLogouted).AddSeconds(rnd.Next(200 , 300)));
command.Parameters.Add("@taskid", 4444); // start_advanture
command.ExecuteNonQuery();
query = "INSERT INTO UpgradeQueue (server,account,password,datecreated,dateend,taski d) VALUES(@server,@account, @password,@datecreated,@dateend,@taskid)";
command = new SqlCommand(query, connection);
command.CommandTimeout = 0;
command.Parameters.Add("@server", server);
command.Parameters.Add("@account", account);
command.Parameters.Add("@password", password);
command.Parameters.Add("@datecreated", T);
command.Parameters.Add("@dateend", T.AddMinutes(TimeLogouted).AddSeconds(rnd.Next(200 0, 3600)));
command.Parameters.Add("@taskid", 5555); // gardesh
command.ExecuteNonQuery();
query = "INSERT INTO UpgradeQueue (server,account,password,datecreated,dateend,taski d) VALUES(@server,@account, @password,@datecreated,@dateend,@taskid)";
command = new SqlCommand(query, connection);
command.CommandTimeout = 0;
command.Parameters.Add("@server", server);
command.Parameters.Add("@account", account);
command.Parameters.Add("@password", password);
command.Parameters.Add("@datecreated", T);
command.Parameters.Add("@dateend", T.AddMinutes(TimeLoginAgain));
command.Parameters.Add("@taskid", 10000); // timerlogout
command.ExecuteNonQuery();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message + "\r\n\r\n" + account, "db 2" + cookieid);
}
finally { if (connection != null) connection.Close(); }
}
و
public void upg_db(string server, string account, string password, int TaskType)
{
SqlConnection connection = new SqlConnection(Assist.connectionString);
SqlDataReader rdr = null;
String query = "", ip = "", port = "", screen = "", useragent = "", sector = "", tribe = "", activateCode = "";
int serverId = 0, cookieid = -1, tokenlogin = -1;
try
{
connection.Open();
query = "select * from LoginParameters where server='" + server + "' and account='" + account + "' and tokenLogin='0'";
SqlCommand cmd2 = new SqlCommand(query, connection);
cmd2.CommandTimeout = 0;
rdr = cmd2.ExecuteReader();
while (rdr.Read())
{
ip = rdr[2].ToString();
port = rdr[3].ToString();
screen = rdr[4].ToString();
useragent = rdr[5].ToString();
sector = rdr[6].ToString();
tribe = rdr[7].ToString();
cookieid = Convert.ToInt32(rdr[8].ToString());
activateCode = rdr[9].ToString();
serverId = Convert.ToInt32(rdr[10].ToString());
tokenlogin = Convert.ToInt32(rdr[11].ToString());
break;
}
if (rdr != null)
rdr.Close();
if (ip != "" & tokenlogin == 0)
{
query = "UPDATE LoginParameters SET tokenLogin='1' WHERE server='" + server + "' AND account='" + account + "'";
SqlCommand command = new SqlCommand(query, connection);
command.CommandTimeout = 0;
command.ExecuteNonQuery();
if (connection != null)
connection.Close();
Thread t = new Thread((ThreadStart)(() =>
{
mng_acc_database mng = new mng_acc_database(server, account, password, ip, int.Parse(port), useragent, screen, int.Parse(tribe), sector, cookieid, rich_banned, rich_logs, TaskType, activateCode, serverId);
}));
t.IsBackground = true;
t.Start();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message + "\r\n\r\n" + account, "db 2" + cookieid);
}
finally
{
if (rdr != null)
rdr.Close();
if (connection != null)
connection.Close();
}
}
در داخل این تابع هم یک تابع دیگه دارم که با ترد اونو اجرا کردم که داخلش تابع مربوط به دیتابیس این هست:
public void AddTaskToDatabase(int secends)
{
DateTime T = DateTime.Now;
SqlConnection connection = new SqlConnection(Assist.connectionString);
String query = "";
SqlCommand command;
try
{
connection.Open();
if (secends >= 0)
{
int i = 0;
try
{
query = "select count(*) from UpgradeQueue WHERE server='" + Server + "' AND account='" + Account + "' and taskid<'1000'";
command = new SqlCommand(query, connection);
command.CommandTimeout = 0;
i = Convert.ToInt32(command.ExecuteScalar());
}
catch (Exception ex) { MessageBox.Show(ex.Message + "\r\n" + Account + "\r\n" + Task + "\r\n" + Server, "a000"); }
if (i == 1)// update
{
query = "UPDATE UpgradeQueue SET datecreated='" + T + "', dateend='" + T.AddSeconds(secends) + "', taskid='" + Task + "' WHERE server='" + Server + "' AND account='" + Account + "' and taskid<'1000' and dateend <= convert(datetime,'" + DateTime.Now + "',121)";
command = new SqlCommand(query, connection);
command.CommandTimeout = 0;
command.ExecuteNonQuery();
}
else// insert
{
}
}
else if (secends == -2)// banned
{
query = "DELETE FROM UpgradeQueue WHERE server='" + Server + "' AND account='" + Account + "'";
command = new SqlCommand(query, connection);
command.CommandTimeout = 0;
command.ExecuteNonQuery();
}
else
MessageBox.Show("error secends up\r\n\r\n acc:" + Account, "sec:" + secends + " task:" + Task);
}
catch (Exception ex) { MessageBox.Show(ex.Message, "in thread tsk " + secends); }
finally { if (connection != null) connection.Close(); }
}
وقتی تعداد رکورد های دیتابیس زیاد شد کار به مشکل بر میخوره . مثلا تا زمانی که کمتر از 7 هزار تا هست به خوبی کار میکنه اما 7 هزار تا رو که رد کرد زمان اجرای query ها افزایش پیدا میکنه و کاری که من نوشتم تو یک زمان معین انجام بده رو حدودا 1 ساعت دیرتر انجام میده