PDA

View Full Version : حرفه ای: بهینه سازی کد اتصال به database و queryها



NasimBamdad
شنبه 14 شهریور 1394, 14:06 عصر
سلام و خسته نباشید

بنده یک نرم افزار WinForm طراحی کردم که کارای مربوط به ثبت نسخ و حسابداری و ... انجام میدم

کاربران این نرم افزار از منزل هم کار می کنند ، به همین دلیل دیتابیس نرم افزار رو روی یک سرور ویندوزی قراردادم ( هاست خریدم ) و از اون طریق دارن با نرم افزار کار می کنند ( با تنظیم Connection String )

حالا یه مشکلی داریم .


بنده یکسری کوری دارم که نه سنگینه و نه سبک که در پایین نوشتم . زمانی که در لوکال کار می کنیم در مدت زمان 5 تا 10 ثانیه کار می کنه و فایل ها رو می سازه

اما زمانی که روی سرور ازش استفاده می کنیم 10 دقیقه طول می کشه

لازم به ذکر است که سرور هم در ایران هست و پینگ زیر 100 داره .


از BackGround Worker هم استفاده کردم ، که هم برنامه هنگ نکنه و هم بهتر باشه ، اما فایده نداشت


using System;
using System.ComponentModel;
using System.Data;
using System.IO;
using System.Text;
using System.Windows.Forms;

namespace Nosakh
{
public partial class XML_Khadamat_Darmangah_Public : Form
{
BackgroundWorker worker = new BackgroundWorker();
private StreamWriter Write;
private MyDB db = new MyDB();
private DataSet ds = new DataSet();
private string sex = string.Empty;
private string exprtyID = string.Empty;

private int count;
private string sg = string.Empty;
private DataSet ds_info = new DataSet();
private string center_code = string.Empty;


public XML_Khadamat_Darmangah_Public()
{
InitializeComponent();
InitializeBackgroundWorker();
}

private void InitializeBackgroundWorker()
{
worker.WorkerReportsProgress = true;
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged );
}

void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}

void worker_DoWork(object sender, DoWorkEventArgs e)
{
int numz = Convert.ToInt16(comboBox2.SelectedValue);

if (numz == 2)
{
Write =
new StreamWriter(Application.StartupPath + @"\XML\Khadamat\Darmangah\VIS_Omoomi\" + "NOS10.TXT",
false,
Encoding.UTF8);
}
else
{
Write =
new StreamWriter(
Application.StartupPath + @"\XML\Khadamat\Darmangah\VIS_Omoomi\" + "NOS" + numz + ".TXT", false,
Encoding.UTF8);

}
db.SetCommand(@"Select COUNT(*) AS num
FROM dbo.patients INNER JOIN
dbo.invoice ON dbo.patients.id = dbo.invoice.patientid INNER JOIN
dbo.khedmat_type ON dbo.invoice.khID = dbo.khedmat_type.id INNER JOIN
dbo.pezeshk ON dbo.patients.pezeshkID = dbo.pezeshk.id
WHERE dbo.patients.bimeID = '2' AND dbo.patients.centerID = '" + comboBox1.SelectedValue + "' AND dbo.pezeshk.exprtID = 1 AND (dbo.khedmat_type.kh_groupID = 1 OR dbo.khedmat_type.kh_groupID = 13) AND dbo.patients.khadamatID = '" + comboBox2.SelectedValue + "' AND patients.nos_date BETWEEN '" + Date1.Shamsi + "' AND '" + Date2.Shamsi + "'");
DataSet ds1 = db.GetData();
db.exec();

count = Convert.ToInt32((Convert.ToString(ds1.Tables[0].Rows[0]["num"])));

db.SetCommand(@"SELECT dbo.patients.id AS PID, dbo.patients.fname, dbo.patients.lname, dbo.pezeshk.pezeshk_name, dbo.pezeshk.nezam_code, dbo.patients.serial, dbo.patients.sexID, dbo.patients.expr_date, dbo.patients.nos_date,
dbo.patients.page_no, dbo.pezeshk.pezeshktypeID, dbo.khedmat_type.kh_groupID, dbo.invoice.tarefe, dbo.invoice.sazman, dbo.invoice.feranshiz
FROM dbo.patients INNER JOIN
dbo.invoice ON dbo.patients.id = dbo.invoice.patientid INNER JOIN
dbo.khedmat_type ON dbo.invoice.khID = dbo.khedmat_type.id INNER JOIN
dbo.pezeshk ON dbo.patients.pezeshkID = dbo.pezeshk.id
WHERE dbo.patients.bimeID = '2' AND dbo.patients.centerID = '" + comboBox1.SelectedValue + "' AND dbo.pezeshk.exprtID = 1 AND (dbo.khedmat_type.kh_groupID = 1 OR dbo.khedmat_type.kh_groupID = 13) AND dbo.patients.khadamatID = '" + comboBox2.SelectedValue + "' AND patients.nos_date BETWEEN '" + Date1.Shamsi + "' AND '" + Date2.Shamsi + "' ORDER BY dbo.khedmat_type.kh_groupID,dbo.patients.nos_date");
ds_info = db.GetData();
db.exec();


db.SetCommand(@"Select center_code_khadamat From center where id = '" + comboBox1.SelectedValue + "'");
DataSet cn_code = db.GetData();
db.exec();
center_code = cn_code.Tables[0].Rows[0]["center_code_khadamat"].ToString();

string Fdate0 = Date1.Shamsi.Remove(0, 2);
string Ldate0 = Date2.Shamsi.Remove(0, 2);
Fdate0 = Fdate0.Replace("/", "");
Ldate0 = Ldate0.Replace("/", "");

string title = comboBox1.Text;

Write.WriteLine("<Y>");
Write.WriteLine("");
Write.WriteLine("<HR>");
Write.WriteLine("<DC>" + center_code + "</DC>");
Write.WriteLine("<DN>" + title + "</DN>");
Write.WriteLine("<RC>" + count + "</RC>");
Write.WriteLine("<FD>" + Fdate0 + "</FD>");
Write.WriteLine("<TD>" + Ldate0 + "</TD>");
Write.WriteLine("<CR>09186812249 - Mohsen Heshmati</CR>");
Write.WriteLine("<RT>1</RT>");
Write.WriteLine("<AN></AN>");
Write.WriteLine("<NM></NM>");
Write.WriteLine("<MC></MC>");
Write.WriteLine("</HR>");

for (int i = 0; i < count; i++)
{
string nezam_code = Convert.ToString(ds_info.Tables[0].Rows[i]["nezam_code"]);
string pezeshk_name = Convert.ToString(ds_info.Tables[0].Rows[i]["pezeshk_name"]);
string nos_date = Convert.ToString(ds_info.Tables[0].Rows[i]["nos_date"]);
string expr_date = Convert.ToString(ds_info.Tables[0].Rows[i]["expr_date"]);
string serial = Convert.ToString(ds_info.Tables[0].Rows[i]["serial"]);
string page_no = Convert.ToString(ds_info.Tables[0].Rows[i]["page_no"]);

string tarefe = Convert.ToString(ds_info.Tables[0].Rows[0]["tarefe"]);
string sazman = Convert.ToString(ds_info.Tables[0].Rows[0]["sazman"]);
string feranshiz = Convert.ToString(ds_info.Tables[0].Rows[0]["feranshiz"]);

string kh_code = Convert.ToString(ds_info.Tables[0].Rows[0]["kh_code_khadamat"]);

if (ds_info.Tables[0].Rows[i]["kh_groupID"].ToString() == "1")
{
sg = "21";
}
else
{
sg = "22";
}
exprtyID = ds_info.Tables[0].Rows[i]["pezeshktypeID"].ToString();
if (ds_info.Tables[0].Rows[i]["sexID"].ToString() == "1")
{
sex = "1";
}
else
{
sex = "0";
}
int i2 = i + 1;

nos_date = nos_date.Remove(0, 2);
nos_date = nos_date.Replace("/", "");
expr_date = expr_date.Remove(0, 2);
expr_date = expr_date.Replace("/", "");

Write.WriteLine("");
Write.WriteLine("<X>");
Write.WriteLine("<PH>");
Write.WriteLine("<SQ>" + i2 + "</SQ><ND>" + nos_date + "</ND><RD>" + nos_date + "</RD><VD>" + expr_date + "</VD><PT>105</PT><SN>" + serial + "</SN><GR>" + sex + "</GR><RN>" + page_no + "</RN><PG>" + exprtyID + "</PG><PC>" + nezam_code + "</PC><PP>" + tarefe + "</PP><PS>" + feranshiz + "</PS><IS>" + sazman + "</IS><PF>" + pezeshk_name + "</PF>");
Write.WriteLine("</PH>");
Write.WriteLine("<BY>");
Write.WriteLine("<MH><MG>" + kh_code + "</MG><SG>" + sg + "</SG><MD>1</MD><MR>1</MR><MP>" + tarefe + "</MP><MS>" + feranshiz + "</MS><MI>" + sazman + "</MI></MH>");
Write.WriteLine("</BY>");
Write.WriteLine("</X>");

int divid = count/100;

}
Write.WriteLine("</Y>");
Write.Close();
MessageBox.Show("فرآیند به پایان رسید");
}
private void XML_Khadamat_Load(object sender, EventArgs e)
{
Date1.Today_Click(null, null);
Date2.Today_Click(null, null);
Date1.FirstDayOfMonth_Click(null, null);
Date2.LastDayOfMonth_Click(null, null);
string[] str = Date1.Shamsi.Split('/');
for (int i = 0; i < str.Length; i++) ;
string mn1 = Convert.ToString(Convert.ToInt32(str[1]) - 1);

if (mn1.Length == 1)
{
mn1 = 0 + mn1;
}
string[] str2 = Date2.Shamsi.Split('/');
for (int i = 0; i < str2.Length; i++) ;
string mn2 = Convert.ToString(Convert.ToInt32(str2[1]) - 1);

if (mn2.Length == 1)
{
mn2 = 0 + mn2;
}

Date1.Text = str[0] + "/" + mn1.ToString() + "/" + str[2];
Date2.Text = str2[0] + "/" + mn2.ToString() + "/" + str2[2];
db.SetCommand("Select * from center");
ds = db.GetData();
comboBox1.DataSource = ds.Tables[0];
comboBox1.DisplayMember = "center_name";
comboBox1.ValueMember = "id";
db.disconnect();
////////////////////
db.SetCommand("Select * from khadamat");
ds = db.GetData();
comboBox2.DataSource = ds.Tables[0];
comboBox2.DisplayMember = "sandogh_name";
comboBox2.ValueMember = "id";
db.disconnect();
}

private void radButton1_Click(object sender, EventArgs e)
{
progressBar1.Value = 0;
worker.RunWorkerAsync();

}
}
}


آیا کد نویسی بهینه نیست یا سرور مشکل داره ؟

Mahmoud.Afrad
شنبه 14 شهریور 1394, 18:49 عصر
- دو کوئری اول شبیه هستند. از اونجایی که اطلاعات سلکت میشن پس نیازی به Select COUNT(*) نیست. بعد از سلکت دوم، از طریق دیتاست تعداد سطرهای سلکت شده رو بدست بیار.
- اگر داری فایل xml میسازی از کلاسهای مخصوص این کار استفاده کن.
- اگر اصرار داری از streamwriter استفاده کنی باید متدهای write , read رو به حداقل برسونی.

ژیار رحیمی
شنبه 14 شهریور 1394, 19:56 عصر
دوست گرامی وقت عالی بخیر.به نظر من بهتره دستوراتی که در Background مینویسی فقط دیتا رو از دیتابیس بخونه و در دیتاتیبل بزاره.شما پردازش داده ها رو در دیتاتیبل رو در در بخش Background نوشتی بخصوص حلقه for و چند خط بالای لازم نیست در Background اجرا بشه به نظر من این خروجی Background رو به تاخیر میندازه.بعد اگر امکان داره دلیل اینکه خروجی رو تبدیل به xml میکنی چیه؟ شاید راه بهتری با همفکری سایر دوستان یافت بشه

NasimBamdad
شنبه 14 شهریور 1394, 20:13 عصر
دوست گرامی وقت عالی بخیر.به نظر من بهتره دستوراتی که در Background مینویسی فقط دیتا رو از دیتابیس بخونه و در دیتاتیبل بزاره.شما پردازش داده ها رو در دیتاتیبل رو در در بخش Background نوشتی بخصوص حلقه for و چند خط بالای لازم نیست در Background اجرا بشه به نظر من این خروجی Background رو به تاخیر میندازه.بعد اگر امکان داره دلیل اینکه خروجی رو تبدیل به xml میکنی چیه؟ شاید راه بهتری با همفکری سایر دوستان یافت بشه

این XML فرمت مورد نیاز بیمه هست که زبان xml هست اما در یک فایل txt ذخیره میشه

در واقع شبیه به XML هستند اما در یک فایل متنی ذخیره میشند برای اینکه در ادارات بیمه IMPORT بشن