PDA

View Full Version : کپی جدول sql در جدول access



mostafag
دوشنبه 09 بهمن 1396, 14:24 عصر
سلام خدمت شما
من توی یه قسمت از برنامم نیاز دارم تا اطلاعاتی رو از یه جدول در sql بخونم و در یه جدول که ماله برنامه است و اکسس هست ذخیره کنم. هر چی گشتم روشی برای اینکار پیدا نکردم به همین علت مجبور شدم اطلاعات رو از sql واکشی کنم و داخل یه دیتاگرید نمایش بدم، بعدش ردیف به ردیف با استفاده از یه حلقه دیتاگرید رو پیمایش کنم و یکی یکی توی جدولم داخل اکسس ذخیره کنم!! اینکار به شدت زمان بر هست به همین جهت ازتون تمنا دارم کمکم کنید روش بهتری رو که زمان نمیبره انجام بدم. تشکر از شما

با این کد اطلاعات رو از sql میخونم و توی جدول نمایش میدم:


try
{
frmUpdateBank.ActiveForm.Cursor = Cursors.WaitCursor;
cmd.Connection = con;


cmd.CommandText = (txtcmd.Text);
adp = new SqlDataAdapter(cmd);
adp.Fill(ds, "Qry_BAS");
dgPersenel.DataSource = ds.Tables["Qry_BAS"];
frmUpdateBank.ActiveForm.Cursor = Cursors.Default;


}
catch
{
MessageBox.Show("خطایی رخ داده است", "خطا", MessageBoxButtons.OK, MessageBoxIcon.Error);
frmUpdateBank.ActiveForm.Cursor = Cursors.Default;
}


کد بالا زمان نمیبره و اطلاعات رو میخونه و نشون میده.

اما کدی که خط به خط میخونم و توی اکسس ذخیره میکنم اینه:





cmdDBTransfer.Connection = conDBTransfer;
cmdDBTransfer.CommandType = CommandType.Text;
cmdDBTransfer.CommandText = "Delete * from TBL_Master";
conDBTransfer.Open();
cmdDBTransfer.ExecuteNonQuery();
conDBTransfer.Close();
cmdDBTransfer.Parameters.Clear();
int tedade = Convert.ToInt16(dgPersenel.RowCount.ToString()) - 1;




for (int i = 0; i <= tedade; i++)
{
Application.DoEvents();
cmdDBTransfer.Connection = conDBTransfer;
cmdDBTransfer.CommandType = CommandType.Text;
cmdDBTransfer.CommandText = "INSERT INTO TBL_Master(Rank, Br, FirstName, LastName, PersonalCode, TOT, N, F, T, T2, a, JOB, UD) VALUES (@Rank=,@Branch=,@FirstName,@LastName,@PersonalCod e,@TOT=,@N=,@F=,@T=,@T2,@a=,@JOB=,@UD)";
cmdDBTransfer.Parameters.AddWithValue("@Rank", dgPersenel.Rows[i].Cells[0].Value.ToString());
cmdDBTransfer.Parameters.AddWithValue("@Branch", dgPersenel.Rows[i].Cells[1].Value.ToString());
cmdDBTransfer.Parameters.AddWithValue("@FirstName", dgPersenel.Rows[i].Cells[2].Value.ToString());
cmdDBTransfer.Parameters.AddWithValue("@LastName", dgPersenel.Rows[i].Cells[3].Value.ToString());
cmdDBTransfer.Parameters.AddWithValue("@PersonalCode", dgPersenel.Rows[i].Cells[4].Value.ToString());


if (dgPersenel.Rows[i].Cells[5].Value.ToString() != "")
{
cmdDBTransfer.Parameters.AddWithValue("@TOT", TOT(dgPersenel.Rows[i].Cells[5].Value.ToString()));
}
else
{
cmdDBTransfer.Parameters.AddWithValue("@TOT", "000000");
}




if (dgPersenel.Rows[i].Cells[6].Value.ToString() != "")
n = Convert.ToInt16(dgPersenel.Rows[i].Cells[6].Value.ToString());
else
n = 0;
cmdDBTransfer.Parameters.AddWithValue("@N", n);


if (dgPersenel.Rows[i].Cells[7].Value.ToString() != "")
f = Convert.ToInt16(dgPersenel.Rows[i].Cells[7].Value.ToString());
else
f = 0;
cmdDBTransfer.Parameters.AddWithValue("@F", f);


if (dgPersenel.Rows[i].Cells[8].Value.ToString() != "")
t = Convert.ToInt16(dgPersenel.Rows[i].Cells[8].Value.ToString());
else
t = 0;
cmdDBTransfer.Parameters.AddWithValue("@T", t);


if (dgPersenel.Rows[i].Cells[9].Value.ToString() != "")
t2 = Convert.ToInt16(dgPersenel.Rows[i].Cells[9].Value.ToString());
else
t2 = 0;
cmdDBTransfer.Parameters.AddWithValue("@T2", t2);


if (dgPersenel.Rows[i].Cells[10].Value.ToString() != "")
boy = int.Parse(dgPersenel.Rows[i].Cells[10].Value.ToString());
else
boy = 0;


if (dgPersenel.Rows[i].Cells[11].Value.ToString() != "")
wif = int.Parse(dgPersenel.Rows[i].Cells[11].Value.ToString());
else
wif = 0;


if (dgPersenel.Rows[i].Cells[12].Value.ToString() != "")
fam = int.Parse(dgPersenel.Rows[i].Cells[12].Value.ToString());
else
fam = 0;


if (dgPersenel.Rows[i].Cells[13].Value.ToString() != "")
dot = int.Parse(dgPersenel.Rows[i].Cells[13].Value.ToString());
else
dot = 0;


a = boy + wif + fam + dot;
cmdDBTransfer.Parameters.AddWithValue("@a", a);
cmdDBTransfer.Parameters.AddWithValue("@JOB", dgPersenel.Rows[i].Cells[14].Value.ToString());
cmdDBTransfer.Parameters.AddWithValue("@UD", dgPersenel.Rows[i].Cells[15].Value.ToString());




conDBTransfer.Open();
cmdDBTransfer.ExecuteNonQuery();
conDBTransfer.Close();
cmdDBTransfer.Parameters.Clear();
pb1.Value = pb1.Value + 1;// پروگرس بار
if (i != 0)
lblper1.Text = "%" + (i * 100 / tedade_enteghalaat); // درصد پیشرفت
}
MessageBox.Show("ثبت شد");



کد بالا زمان زیاد میبره. من چند تا قسمت دارم که با همین روش مجبور شدم کارشو انجام بدم که اونا تازه خیلی بیشتر کارای محاسباتی باید انجام بشه و زمان خیلی بیشتری هم میبره ذخیره کردنشون.

توی کد دومی اگه دقت کنید یه سری اعمال هم انجام دادم که البته به طور خلاصه همون چیزی که همون ابتدا گفتم رو میخوام انجام بدم. یعنی کپی یه جدول از Sql به جدولی در اکسس. حالا اگه یه سری تغییرات هم داشته باشه میخوام انجام بدم بعدش ذخیرش کنم. فقط سرعت برام خیلی مهمه . چون جداولم داده های خیلی زیادی دارن.

ممنون از توجهتون

danialafshari
پنج شنبه 12 بهمن 1396, 10:07 صبح
با سلام
اگر میخواید کل دیتابیس sql رو به اکسس تبدیل کنید با حفظ اطلاعات میتونید از نرم افزار ESF Database Migration Toolkit استفاده کنید

mostafag
پنج شنبه 12 بهمن 1396, 12:57 عصر
با سلام
اگر میخواید کل دیتابیس sql رو به اکسس تبدیل کنید با حفظ اطلاعات میتونید از نرم افزار ESF Database Migration Toolkit استفاده کنید

تشکر از شما
بالاخره یه نفر جواب داد :دی

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

اگه راهنمایی کنید ممنون میشم ....

محمد آشتیانی
پنج شنبه 12 بهمن 1396, 14:56 عصر
سلام
از باز کردن و بستن کانکشن داخل حلقه خودداری کنید ، قبل از حلقه کانشکن رو باز کنید و بعد از حلقه اون رو ببندید (در واقع به ازای هر تعداد رکورد که میخواهید Insert کنید ، فقط یکبار کانکشن باز و بسته بشه)

mostafag
پنج شنبه 12 بهمن 1396, 17:20 عصر
سلام
از باز کردن و بستن کانکشن داخل حلقه خودداری کنید ، قبل از حلقه کانشکن رو باز کنید و بعد از حلقه اون رو ببندید (در واقع به ازای هر تعداد رکورد که میخواهید Insert کنید ، فقط یکبار کانکشن باز و بسته بشه)


تشکر از شما
خب یه سوال مهم اونم اینکه تنها راه حل منطقی همینه؟؟ یعنی روش دیگه ای وجود نداره که سرعتش بالاتر باشه؟ چون اطلاعات خیلی زیاده. یه جدول دیگه دارم که حدود 12 هزار رکورد داره که تعداد ستون های زیادی هم داره و زمان خیلی زیادی میبره. میخوام بدونم هیچ راه دیگه ای وجود نداره برا این موضوع؟

مهرداد صفا
یک شنبه 15 بهمن 1396, 21:45 عصر
سلام خدمت شما
من توی یه قسمت از برنامم نیاز دارم تا اطلاعاتی رو از یه جدول در sql بخونم و در یه جدول که ماله برنامه است و اکسس هست ذخیره کنم. هر چی گشتم روشی برای اینکار پیدا نکردم به همین علت مجبور شدم اطلاعات رو از sql واکشی کنم و داخل یه دیتاگرید نمایش بدم، بعدش ردیف به ردیف با استفاده از یه حلقه دیتاگرید رو پیمایش کنم و یکی یکی توی جدولم داخل اکسس ذخیره کنم!! اینکار به شدت زمان بر هست به همین جهت ازتون تمنا دارم کمکم کنید روش بهتری رو که زمان نمیبره انجام بدم. تشکر از شما


ممنون از توجهتون[/RIGHT]


سلام دوست من.
نیازی نیست که اطلاعات رو سمت کلاینت بیارید و ...
از طریق SQL Server شما می تونید عملیات insert, read, update, delete رو روی یک جدول اکسس یا هر پایگاه داده دیگه ای که از طریق OLEDB قابل دسترس باشه، انجام بدید.
فقط نیازه که از دستور OPENDATASOURCE (https://docs.microsoft.com/en-us/sql/t-sql/functions/opendatasource-transact-sql) استفاده کنید و جدول مورد نظر رو باز کنید.
به این شکل تقریبا:

INSERT INTO
OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0','DataBase =MyDatabase.MDB').TableName
SELECT * FROM MySqlTableName;



البته در صورتی که نام فیلد ها با هم مغایرت داشته باشه می تونید فیلد ها رو داخل دستور insert و select مشخص کنید و اگر پردازش خیلی زیادی روی اطلاعات نیاز بود می تونید قبل از insert، اطلاعات رو داخل یک جدول موقت واکشی کنید و بعد از پردازش داخل access قرار بدید.
موفق باشید.