PDA

View Full Version : سوال: مشکل با انتقال 80 هزار رکورد از اکسس به اس کیو ال بصورت یکجا



m_royana
یک شنبه 12 مرداد 1393, 17:50 عصر
با سلام
من برنامه ای دارم و مجبورم حداقل ماهی یک بار یکی از جداول بانک اس کیو ال (که روی سرور شبکه قرار دارد) رو خالی کنم و مجددا با اطلاعاتی که از یک فایل اکسس برمیدارم پر کنم.
با استفاده از حلقه ای اطلاعات رو سطر به سطر از اکسس می خونم و در اس کیو ال insert می کنم.
حالا مشکل اینجاست که در حین این جابجایی به مرور سرعت کاهش پیدا می کنه و وقتی به حدود 80٪ میرسه ( بعد از حدود 15 ساعت ) دیگه هیچی ثبت نمیکنه. البته خطایی هم نمیده.
خیلی جستجو کردم اما به نتیجه ای نرسیدم.
سی شارپ 2008 - اس کیو ال سرور 2005 - اکسس 2010
اینم کدم :
private void button2_Click(object sender, EventArgs e)
{
try
{
SqlCommand com = new SqlCommand("delete from m_moshtarakin", CON);
CON.Open();
com.ExecuteNonQuery();
CON.Close();

}
catch(Exception ex)
{
MessageBox.Show(ex.ToString());
}
Thread thread1 = new Thread(upp);
thread1.Start();

}

.................................................. .................................................. .................................................. ....................................

public void upp()
{
try
{
string ramz;
string parvande;
string onvan;
string address;
string tarefe;
string faaz;
string amper;
string dimand;
string nahiye;
string roozkar;
string mamoor;
string serial;
string sakhtemani;


int row = dataGridView1.RowCount;
int i = 0;
for (i = 0; i < row; i++)
{
label6.Text = dataGridView2.RowCount.ToString();
decimal a1 = dataGridView1.RowCount;
decimal a2 = i;
decimal a3;
try
{
a3 = ((a2 * 100) / a1);
label2.Text = a3.ToString();
}
catch
{ }
ramz = dataGridView1[0, i].Value.ToString();
parvande = dataGridView1[1, i].Value.ToString();
onvan = ConvertCharFaToAr(dataGridView1[2, i].Value.ToString());
address = ConvertCharFaToAr(dataGridView1[3, i].Value.ToString());
tarefe = dataGridView1[4, i].Value.ToString();
faaz = dataGridView1[5, i].Value.ToString();
amper = dataGridView1[6, i].Value.ToString();
dimand = dataGridView1[7, i].Value.ToString();
nahiye = dataGridView1[8, i].Value.ToString();
roozkar = dataGridView1[9, i].Value.ToString();
mamoor = dataGridView1[10, i].Value.ToString();
serial = dataGridView1[11, i].Value.ToString();
sakhtemani = dataGridView1[12, i].Value.ToString();


newRow = sql_DS.Tables["m_moshtarakin"].NewRow();
SqlCommand cmdClasf;
strSql = "insert into m_moshtarakin(" + "ramz," + "parvande," + "onvan," + "address," + "tarefe," + "faaz," + "amper," + "dimand," + "nahiye," + "roozkar," + "mamoor," + "serial," + "sakhtemani" +
")VALUES('" + ramz + "','" + parvande + "','" + onvan + "','" + address + "','" + tarefe + "','" + faaz + "','" + amper + "','" + dimand + "','" + nahiye + "','" + roozkar + "','" + mamoor + "','" + serial + "','" + sakhtemani + "')";
CON.Open();
cmdClasf = new SqlCommand(strSql, CON);
cmdClasf.ExecuteNonQuery();
CON.Close();
sql_DS.Clear();
sql_DA.Fill(sql_DS, "m_moshtarakin");
sql_CB = new SqlCommandBuilder(sql_DA);
sql_DA.Update(sql_DS, "m_moshtarakin");
CON.Close();
label6.Text = i.ToString();
}




}
catch (Exception ex)
{
CON.Close();
MessageBox.Show(ex.ToString());
}


}


اساتید گرامی راهنمایی بفرمایید چطوری مشکل رو حل کنم ؟

fakhravari
یک شنبه 12 مرداد 1393, 18:29 عصر
از راه export از داخل خود access استفاده کنید

hamid_hr
یک شنبه 12 مرداد 1393, 18:35 عصر
کانکشن رو قبل از حلقه Open کن و وقتی کارت تموم میشه Close کن

alibilgats
یک شنبه 12 مرداد 1393, 21:59 عصر
دوست عزیز کد نویسی شما از نظر اصولی یه سری مشکلات اساسی داره!
اولیش رو دوست خوبم hamid_hr (http://barnamenevis.org/member.php?25531-hamid_hr) درست گفتن. شما نباید برای هر رکورد ;()CON.Open رو اجرا کنی. فقط کافیه یه بار قبل شروع حلقه اینکارو انجام بدی و بعد از تموم شدن حلقه Close کنی.

دومین نکته اینه که شما رکوردها رو به نظر من لازم نیست بریزی توی دیتاگرید بعد از اون بخونی! بریز توی Dataset و از اون بخون! اینطوری سرعت کار میره بالا!

درضمن این قسمت از کد شما رو متوجه نشدم دقیقا چیکار میکنه!

sql_DS.Clear();
sql_DA.Fill(sql_DS, "m_moshtarakin");
sql_CB = new SqlCommandBuilder(sql_DA);
sql_DA.Update(sql_DS, "m_moshtarakin");
CON.Close();

درضمن 80 هزارتا رکورد توی 15 ساعت اصلا خودش یه رکورد حساب میشه! کامپیوتر اگه cpu هم نداشته باشه باز 15 ساعت واسه 80 هزارتا وحشتناکه!:متعجب:
نهایتا باید 5 الی 10 دقیقه طول بکشه!

Babak-Magic
یک شنبه 12 مرداد 1393, 23:06 عصر
درود
بخش کد نویسی که دوستان فرمودند واقعا جالب نبود
اما راه حل زیاد داری
یکیش اینکه تیبلی که می خوای رو Import کن تو sql بد یه insert into Your_Sql_Table از select * from Your_access_table بزن

m_royana
دوشنبه 13 مرداد 1393, 08:54 صبح
از راه export از داخل خود access استفاده کنید


درود
بخش کد نویسی که دوستان فرمودند واقعا جالب نبود
اما راه حل زیاد داری
یکیش اینکه تیبلی که می خوای رو Import کن تو sql بد یه insert into Your_Sql_Table از select * from Your_access_table بزن

با تشکر از پاسختون
به دلیل اینکه من به اس کیو ال سرور دسترسی ندارم (به دلایل امنیتی از سوی مدیران شبکه) و اینکه بعضی از فیلدها رو باید از نظر حروف "ی" و "ک" استاندارد کنم حتما باید از طریق برنامه این کار رو کنم.

m_royana
دوشنبه 13 مرداد 1393, 09:42 صبح
دوست عزیز کد نویسی شما از نظر اصولی یه سری مشکلات اساسی داره!
اولیش رو دوست خوبم hamid_hr (http://barnamenevis.org/member.php?25531-hamid_hr) درست گفتن. شما نباید برای هر رکورد ;()CON.Open رو اجرا کنی. فقط کافیه یه بار قبل شروع حلقه اینکارو انجام بدی و بعد از تموم شدن حلقه Close کنی.

دومین نکته اینه که شما رکوردها رو به نظر من لازم نیست بریزی توی دیتاگرید بعد از اون بخونی! بریز توی Dataset و از اون بخون! اینطوری سرعت کار میره بالا!

درضمن این قسمت از کد شما رو متوجه نشدم دقیقا چیکار میکنه!

sql_DS.Clear();
sql_DA.Fill(sql_DS, "m_moshtarakin");
sql_CB = new SqlCommandBuilder(sql_DA);
sql_DA.Update(sql_DS, "m_moshtarakin");
CON.Close();

درضمن 80 هزارتا رکورد توی 15 ساعت اصلا خودش یه رکورد حساب میشه! کامپیوتر اگه cpu هم نداشته باشه باز 15 ساعت واسه 80 هزارتا وحشتناکه!:متعجب:
نهایتا باید 5 الی 10 دقیقه طول بکشه!



کانکشن رو قبل از حلقه Open کن و وقتی کارت تموم میشه Close کن

با تشکر از دوستان گرامی؛
کد رو به این صورت اصلاح کردم و مشکلم حل شد. حدود 15 دقیقه طول کشید. جهت استفاده دوستانی که احیانا مشکل مشابه داشتند اینجا قرار میدم.



public void upp()
{
//////////////////////////////////////////////////////////////////////////////
try
{
SqlCommand com = new SqlCommand("delete from m_moshtarakin", CON);
CON.Open();
com.ExecuteNonQuery();
CON.Close();


}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
//////////////////////////////////////////////////////////////////////////////
try
{
string ramz, parvande, onvan, address, tarefe, faaz, amper, dimand, nahiye, roozkar, mamoor, serial, sakhtemani;
int row = dataGridView1.RowCount;
int i = 0;
CON.Open();
for (i = 0; i < row; i++)
{
decimal a1 = dataGridView1.RowCount;
decimal a2 = i;
decimal a3;
try //محاسبه درصد تقریبی روند اجرای انتقال
{
a3 = ((a2 * 100) / a1);
label2.Text = a3.ToString();
}
catch
{ }
ramz = dataGridView1[0, i].Value.ToString();
parvande = dataGridView1[1, i].Value.ToString();
onvan = ConvertCharFaToAr(dataGridView1[2, i].Value.ToString());
address = ConvertCharFaToAr(dataGridView1[3, i].Value.ToString());
tarefe = dataGridView1[4, i].Value.ToString();
faaz = dataGridView1[5, i].Value.ToString();
amper = dataGridView1[6, i].Value.ToString();
dimand = dataGridView1[7, i].Value.ToString();
nahiye = dataGridView1[8, i].Value.ToString();
roozkar = dataGridView1[9, i].Value.ToString();
mamoor = dataGridView1[10, i].Value.ToString();
serial = dataGridView1[11, i].Value.ToString();
sakhtemani = dataGridView1[12, i].Value.ToString();


newRow = sql_DS.Tables["m_moshtarakin"].NewRow();
SqlCommand cmdClasf;
strSql = "insert into m_moshtarakin(" + "ramz," + "parvande," + "onvan," + "address," + "tarefe," + "faaz," + "amper," + "dimand," + "nahiye," + "roozkar," + "mamoor," + "serial," + "sakhtemani" +
")VALUES('" + ramz + "','" + parvande + "','" + onvan + "','" + address + "','" + tarefe + "','" + faaz + "','" + amper + "','" + dimand + "','" + nahiye + "','" + roozkar + "','" + mamoor + "','" + serial + "','" + sakhtemani + "')";
cmdClasf = new SqlCommand(strSql, CON);
cmdClasf.ExecuteNonQuery();
}
CON.Close();
}
catch (Exception ex)
{
CON.Close();
MessageBox.Show(ex.ToString());
}
}