PDA

View Full Version : کمک در خصوص کار با بانک اکسس



rerzaz
شنبه 17 بهمن 1394, 08:32 صبح
سلام اساتید و دوستان عزیز
من چند وقتی است برنامه ای نوشتم که کارش به این صورت است هر ماه حدود 70 هزار تا رکورد تحویل بنده می دهند من باید برای انها بارکد پستی تولید کنم با برنامه ای که من الان نوشتم حدود 24 تا 48 ساعت طول میکشه برای 70 هزارتا بارکد درست بشه ، که زمان خیلی زیادی است می خواستم یک راهنمایی کنید کدی که نوشتن طوری تغییر بدم که زمان کمتری طول بکشه .

کدم به این صورت است :


string dbs = textBox2.Text;
string tables = txttable.Text;
string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + dbs + ";" + "Persist Security Info=False";
OleDbConnection myConnection = new OleDbConnection(connectionString);


string query = "select * from " + tables;


OleDbDataAdapter myAdapter = new OleDbDataAdapter(query, myConnection);
DataSet employeeData = new DataSet();
myAdapter.Fill(employeeData);


// Repeat for each table in the DataSet's table collection.
foreach (DataTable table in employeeData.Tables)
{
// Repeat for each row in the table.
foreach (DataRow row in table.Rows)
{


string num = row["Id"].ToString();
long nume = Convert.ToInt32(num);
string id = row["Id"].ToString();
long ids = Convert.ToInt32(id);
string cod = row["city_cod"].ToString();
string sourcecod = txtsourcecod.Text;
Barcode Test = new Barcode();
Test.SerialNo = ids;
Test.SourceCode = sourcecod;
Test.DestCode = cod;
Test.ServiceType = ParcelServiceType.EMS;
Test.ParcelType = ParcelType.EMS_Letter;
Test.SMSService = false;
Test.TwoReceiptant = true;
Test.ElectronicTwoReceiptant = false;
Test.InsuranceType = InsuranceType.NormalInsurance;
string b;
b = Test.GetBarcode();
string connect = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + dbs + ";" + "Persist Security Info=False";


OleDbConnection OleDbConnection1 = new OleDbConnection(connect);
OleDbCommand OleDbCommand1 = new OleDbCommand();
OleDbCommand1.Connection = OleDbConnection1;
OleDbCommand1.CommandType = CommandType.Text;
//OleDbCommand1.CommandText = "INSERT INTO pasargad (barcod , city , cod , adres , codp , tel , mob , nam , family ) VALUES ('" + b + "','" + city + "','"+cod+"','"+adres+"','"+codp+"','"+tel+"','"+mob+"','"+nam+"','"+family+"')";
OleDbCommand1.CommandText = "update " + tables + " set barcode='" + b + "' where id=" + ids;
OleDbConnection1.Open();
int result = OleDbCommand1.ExecuteNonQuery();
OleDbConnection1.Close();


if (result > 0)
{
OleDbConnection OleDbConnection3 = new OleDbConnection(connect);
OleDbCommand OleDbCommand3 = new OleDbCommand();
OleDbCommand3.CommandType = CommandType.Text;
OleDbCommand3.CommandText = "SELECT * FROM " + tables;
OleDbCommand3.Connection = OleDbConnection1;
OleDbDataAdapter adapter = new OleDbDataAdapter(OleDbCommand3);
DataSet DataSet1 = new DataSet();
adapter.Fill(DataSet1, "'" + tables + "'");
dataGridViewX1.DataSource = DataSet1.Tables["'" + tables + "'"];
}
else
{
MessageBox.Show("Error In Insert");
}


}
}


می دونم مشکل اینجاست که یک رکورد یک رکورد می رم جلو ولی اگه میشه راهنمایی کنید کد رو به چه صورت تغییر بدم

Mahmoud Zaad
شنبه 17 بهمن 1394, 09:31 صبح
سلام
مهمترین مشکلش اینه که توی حلقه ها اومدی مجدداً کانکشن تعریف کردی و کانکشن رو باز و بسته کردی، که نیازی نیست یعنی باید یه کانکشن به صورت سراسری داشته باشی و یکبار قبل از حلقه اون رو Open کنید و بعد از حلقه ها اونو Close کنید الان 70.000 بار کانکشن تعریف و باز و بسته میشه، واویلا!!!:لبخند:
همینطور کامند، شما یه کامند تعریف کنید بعد هرجا که کوئری عوض میشه پارامترهاشو پاک کنید، مثلا اگه اسم کامند شما OleDbCommand3 باشه:
OleDbCommand3.Parameters.Clear();
مورد بعدی اینه که با توجه به اولین کوئری مگه کلاً یه جدول ندارید؟ پس چرا از دیتاست استفاده کردید همون دیتاتیبل کافی هست و از این گذشته وقتی یه جدول دارید چرا foreach نوشتید برای خوندن همه جدولها، اگه یک جدول دارید foreach اول رو کامنت کنید.

**************
یک مورد دیگه اینکه اون دیتاست آخری داخل حلقه، اولاً تبدیلش کنید به دیتاتیبل ثانیا خارج از حلقه تعریفش کنید

En_MK
شنبه 17 بهمن 1394, 09:37 صبح
تمام مواردی که دوستمون گفتند + اینکه میتونید 70هزار تارو به 3 تا(یابیشتر) thread که همزمان با هم این کرا را انجام میدهند تقسیم کنید

rerzaz
شنبه 17 بهمن 1394, 09:51 صبح
سلام
مهمترین مشکلش اینه که توی حلقه ها اومدی مجدداً کانکشن تعریف کردی و کانکشن رو باز و بسته کردی، که نیازی نیست یعنی باید یه کانکشن به صورت سراسری داشته باشی و یکبار قبل از حلقه اون رو Open کنید و بعد از حلقه ها اونو Close کنید الان 70.000 بار کانکشن تعریف و باز و بسته میشه، واویلا!!!:لبخند:
همینطور کامند، شما یه کامند تعریف کنید بعد هرجا که کوئری عوض میشه پارامترهاشو پاک کنید، مثلا اگه اسم کامند شما OleDbCommand3 باشه:
OleDbCommand3.Parameters.Clear();
مورد بعدی اینه که با توجه به اولین کوئری مگه کلاً یه جدول ندارید؟ پس چرا از دیتاست استفاده کردید همون دیتاتیبل کافی هست و از این گذشته وقتی یه جدول دارید چرا foreach نوشتید برای خوندن همه جدولها، اگه یک جدول دارید foreach اول رو کامنت کنید.

**************
یک مورد دیگه اینکه اون دیتاست آخری داخل حلقه، اولاً تبدیلش کنید به دیتاتیبل ثانیا خارج از حلقه تعریفش کنید
من دقیقا نفهمیدم چی شد ، :D اگر میشه همین کد منو ویرایش کنید ممنون میشم

Mahmoud Zaad
شنبه 17 بهمن 1394, 10:15 صبح
من دقیقا نفهمیدم چی شد ، :D اگر میشه همین کد منو ویرایش کنید ممنون میشم

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

rerzaz
شنبه 17 بهمن 1394, 16:23 عصر
کد رو به کد زیر تغییر دادم ، ولی تغییری نکرد

string dbs = textBox2.Text;
string tables = txttable.Text;
string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + dbs + ";" + "Persist Security Info=False";
OleDbConnection myConnection = new OleDbConnection(connectionString);


string query = "select * from " + tables;


OleDbDataAdapter myAdapter = new OleDbDataAdapter(query, myConnection);
DataSet employeeData = new DataSet();
myAdapter.Fill(employeeData);
myConnection.Open();
// Repeat for each table in the DataSet's table collection.
foreach (DataTable table in employeeData.Tables)
{
// Repeat for each row in the table.
foreach (DataRow row in table.Rows)
{


string num = row["Id"].ToString();
long nume = Convert.ToInt32(num);
string id = row["Id"].ToString();
long ids = Convert.ToInt32(id);
string cod = row["city_cod"].ToString();
string sourcecod = txtsourcecod.Text;
Barcode Test = new Barcode();
Test.SerialNo = ids;
Test.SourceCode = sourcecod;
Test.DestCode = cod;
Test.ServiceType = ParcelServiceType.EMS;
Test.ParcelType = ParcelType.EMS_Letter;
Test.SMSService = false;
Test.TwoReceiptant = true;
Test.ElectronicTwoReceiptant = false;
Test.InsuranceType = InsuranceType.NormalInsurance;
string b;
b = Test.GetBarcode();
OleDbCommand OleDbCommand1 = new OleDbCommand();
OleDbCommand1.Connection = myConnection;
OleDbCommand1.CommandType = CommandType.Text;
//OleDbCommand1.CommandText = "INSERT INTO pasargad (barcod , city , cod , adres , codp , tel , mob , nam , family ) VALUES ('" + b + "','" + city + "','"+cod+"','"+adres+"','"+codp+"','"+tel+"','"+mob+"','"+nam+"','"+family+"')";
OleDbCommand1.CommandText = "update " + tables + " set barcode='" + b + "' where id=" + ids;

int result = OleDbCommand1.ExecuteNonQuery();



if (result > 0)
{
OleDbCommand1.CommandText = "SELECT * FROM " + tables;
OleDbCommand1.Connection = myConnection;
OleDbDataAdapter adapter = new OleDbDataAdapter(OleDbCommand1);
DataSet DataSet1 = new DataSet();
adapter.Fill(DataSet1, "'" + tables + "'");
dataGridViewX1.DataSource = DataSet1.Tables["'" + tables + "'"];
}
else
{
MessageBox.Show("Error In Insert");
}


}
}
myConnection.Close();

Mahmoud Zaad
شنبه 17 بهمن 1394, 17:05 عصر
شما فقط کانکشن رو آوردی بیرون بقیه مواردی که گفتم رو انجام ندادید. ضمناً شما هدفت مگه آپدیت همون جدول اولیه نیست؟ اگه هست خب این خط 50 به بعد داستانش چیه؟ این قسمت یعنی if , else رو کلاً کامنت کن. آپدیت 70.000 رکورد چیز خاصی نیست. مگه اینکه اون متدی که برای تولید بارکد هست خیلی زمانبر باشه که قاعدتاً نباید اینطور باشه، شما برای یک رکورد فرضی تست کنید ببینید این متد در چه زمانی جواب میده.

در کل، شما باید تمام تعریف متغیرها رو خارج از حلقه انجام بدید، مثلاً همین خط
Barcode Test = new Barcode();

آیا لازمه داخل حلقه باشه؟