PDA

View Full Version : سوال: معایب و مزایای کد های زیر چیست؟



mostafa_shoakry
پنج شنبه 25 شهریور 1389, 19:26 عصر
سلام
اینا چن تا کدن که می خوام بدونم کدوم یکی صحیح هستند و کدام یک غلط؟
یا اینکه اگه نیاز به تغییر باشه تغییرش بدیم:
خوب این از اولی:
کد اضافه کردن به دیتا بیس بدون SP :


using (SqlConnection con = new SqlConnection(Properties.Settings.Default.SQLDatab ase))
{
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandType = CommandType.Text;
cmd.CommandText = "Insert Into Table1(Name, Fname) Values (@Name, @Fname)";
cmd.Parameters.AddWithValue("@Name", textBox1.Text);
cmd.Parameters.AddWithValue("@Fname", textBox2.Text);
con.Open();
cmd.ExecuteNonQuery();

}
دومی اضافه کردن به دیتا بیس با SP:


sqlcon=new SqlConnection(DB Path);
SqlCommand cmd=new SqlCommand();
cmd.Connection=sqlcon;
cmd.CommandType=CommandType.StoredProcedure;
cmd.CommandText=”ProcedureName”;
cmd.Parameters.AddWithValue(“@Field1”,value1);
cmd.Parameters.AddWithValue(“@Field2”,value2);
cmd.Parameters.AddWithValue(“@Fieldn”,valuen);
sqlcon.Open();
cmd.ExecuteNonQuery();
sqlcon.Close();
آپدیت کردن دیتا بیس بدون SP:

using (SqlConnection con = new SqlConnection(Properties.Settings.Default.SQLDatab ase))
{
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandType = CommandType.Text;
cmd.CommandText = "Update Table1 SET Name=@Name,Fname=@Fname Where ID=" + comboBox2.SelectedValue.ToString() + "";
cmd.Parameters.AddWithValue("@Name", textBox3.Text);
cmd.Parameters.AddWithValue("@Fname", textBox4.Text);
con.Open();
cmd.ExecuteNonQuery();

}
آپدیت کردن دیتا بیس با SP:


کدشو گم کردم. ولی فک کنم مانند اد هست با کمی تغییر.در این نمونه بیشتر مد نظرم اینه که آیا از

DataTable.Fill()استفاده کنیم یا از

DataTable.Load()یعنی کدام یک بهتر است؟

کد کامل:

using (SqlConnection con = new SqlConnection(Properties.Settings.Default.SQLDatab ase))
{
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandType = CommandType.Text;
cmd.CommandText = "Select * from Table1";
con.Open();
SqlDataReader dr = cmd.ExecuteReader();
DataTable dt = new DataTable();
dt.Load(dr);
foreach (DataRow row in dt.Rows)
{
dataGridView1.Rows.Add(row["ID"].ToString(),row["Name"].ToString(),row["Fname"].ToString());
}

}
استفاده از SP خروجی دار!!!! :
شکل کلی در SQL Server:


Create Proc ProcName
@Var1 DataType,
@ Var2 DataType,
. ,
. ,
. ,
@ Varn DataType
@ OutputVar dataType[=مقدار اوليه] OutPut //در صورت نياز مي تواند مقدار اوليه داشته باشد.
As
Insert Into TableName(Filed1, Filed2, … , Filedn) values (@Var1, @Var2,.., @Varn)
Set @OutputVar = Scope_Identity()
فرا خوانی آن در C#‎‎.NET


SqlCommand cmd = new sqlCommand();
cmd.Connection= Sqlcon;
cmd.CommandType=CommandType.StoredProcedure;
cms.CommandText=”ProcedureName”;
cmd.Parameters.AddWithValue(“@Field1”,value1);
cmd.Parameters.AddWithValue(“@Field2”,value2);
.
.
.
cmd.Parameters.AddWithValue(“@Fieldn”,valuen);
cmd.Parameters.Add(“@OutputVar”,SqlType..,Leng th);
cmd.Parameters[“@OutputVar”].Direction.ParametersDirection.Output;
sqlcon.Open();
cmd.ExecuteNonQuery();
string strString=cmd.Parameters[“@OutputVar”].Value.ToString();
sqlcon.Close();
بعضی از کدها رو قبلا داشتم دیگه ویرایش نکردم و همونجوری در اینجا قرار دادم.
بماند که در بعضی ها از بلوک using استفاده نشده (به دلیل اینکه در خط قبلی ذکر کردم!!!!)
سوال دیگه ای بود در خدمتم. :لبخند:
از اساتید محترم خواهشمندم منو راهنمایی کنن.:قلب:

salehbagheri
پنج شنبه 25 شهریور 1389, 21:22 عصر
اینکه مثل روز روشنه که محل نوشتن و ذخیره کردن کدهای SQL درون Database هست. فکر نمیکنم جای سوالی بمونه ...

اما روشهای دریافت اطلاعات، خواندن و یا ... روشهای گوناگونی دارند که هیچ کدوم رو کاملاً نمیشه نفی کرد. هریک برتریهای خاص خودش رو بر دیگری داره ...

mostafa_shoakry
پنج شنبه 25 شهریور 1389, 21:29 عصر
اینکه مثل روز روشنه که محل نوشتن و ذخیره کردن کدهای SQL درون Database هست. فکر نمیکنم جای سوالی بمونه ...

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

saeed1386
پنج شنبه 25 شهریور 1389, 22:24 عصر
سلام.
من چند تا نکته به ذهنم رسید. شاید سختگیرانه باشه ولی بهتره انجام بشه.



cmd.Parameters.AddWithValue("@Name", textBox1.Text);

در اینجا به دلیل استفاده از textBox1.Text ، پارامتر Name@ همیشه حاوی مقدار خواهد بود. اگه میتونه null هم بگیره بهتره چک بشه.



sqlcon.Open();
cmd.ExecuteNonQuery();
sqlcon.Close();
دستور
sqlcon.Close(); هم بهتره درون
finally باشه تا در موقع خطا اجرا بشه



foreach (DataRow row in dt.Rows)
{
dataGridView1.Rows.Add(row["ID"].ToString(),row["Name"].ToString(),row["Fname"].ToString());
}

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

Sajjad.Aghapour
جمعه 26 شهریور 1389, 14:16 عصر
اینکه از Load استفاده کنید یا Fill، هردوی اونها در اصل از DataReader برای پرکردن DataTable استفاده میکنند، اما استفاده از Load کندتر از Fill هستش....

mostafa_shoakry
جمعه 26 شهریور 1389, 15:12 عصر
اینکه از Load استفاده کنید یا Fill، هردوی اونها در اصل از DataReader برای پرکردن DataTable استفاده میکنند، اما استفاده از Load کندتر از Fill هستش....
ممنون از جوابتون.آخه می دونین من شک داشتم. یکی می گفت که Fill خیلی بدتر از load هست و هیچوقت از Fill استفاده نکنید.خصوصا در برنامه های تحت شبکه.
ممنون که رفع ابهام کردید.:قلب:

Sajjad.Aghapour
جمعه 26 شهریور 1389, 18:38 عصر
ممنون از جوابتون.آخه می دونین من شک داشتم. یکی می گفت که Fill خیلی بدتر از load هست و هیچوقت از Fill استفاده نکنید.خصوصا در برنامه های تحت شبکه.
ممنون که رفع ابهام کردید.:قلب:

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