PDA

View Full Version : سوال: دادن مقادیر آرایه به sql



حسن رضازاده
سه شنبه 13 تیر 1391, 10:21 صبح
سلام
من از دستور زیر برای دادن مقادیر ارایه به sql استفاده کردم اما فقط اولین مقدار رفت و وقتی به مقدار دوم رسید پیام خطا داد ،چطور این کد رو تغییر بدم تا بتونم مقدار ارایه رو در sql بزارم ؟


int student;
int lessen = Convert.ToInt32(DropDownList1.SelectedValue);
string grade = "";
string data1 = string.Format(" {0}, {1}/{2}/{3}", jc.GetDayOfWeek(thisDate), jc.GetYear(thisDate), jc.GetMonth(thisDate), jc.GetDayOfMonth(thisDate));


try
{
string connectionstring = System.Configuration.ConfigurationManager.Connecti onStrings["ConnectionString"].ToString();
string cText = string.Format("insert into mshgrade (student,lessen,grade,data) values(@student,@lessen,@grade,@data)");
SqlConnection conn = new SqlConnection(connectionstring);
SqlCommand cmd = new SqlCommand(cText, conn);
for (int i = 0; i < dt.Rows.Count; i++)
{
student = Convert.ToInt32( dt.Rows[i][0]);
grade = text_key[i].Text;
cmd.Parameters.Add("@lessen", lessen);
cmd.Parameters.Add("@data", data1.ToLower());
cmd.Parameters.Add("@student", student);
cmd.Parameters.Add("@grade", grade.ToLower());
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
}

}
catch (Exception e1)
{
Label1.Text = e1.Message;
}

mehdi.mousavi
سه شنبه 13 تیر 1391, 15:10 عصر
سلام.
قبل از هر چیز، شما باید جای متود Add از AddWithValue استفاده کنید؛ فرضا جای

cmd.Parameters.Add("@lessen", lessen);

باید

cmd.Parameters.AddWithValue("@lessen", lessen);

رو بنویسید. مساله دوم نحوه پر کردن Parameters هستش... چون در دور اول حلقه Parameters رو تعیین می کنید، در نتیجه دیگه نمتونید در دور دوم مجددا همون Parameters ها رو روی cmd به Collection مربوطه بیفزایید. بنابراین، باید در ابتدای حلقه، Collection مربوطه رو Clear کنید:

cmd.Parameters.Clear();

و مشکل رفع خواهد شد. اما رفع مشکل به معنای خوب بودن این روش نیست، چون شما دارید در هر بار اجرای حلقه، Connection رو باز و بسته می کنید. پس روش بهتر چیه؟ روش بهتر اینه که شما قبل از Loop ابتدا Connection رو باز کنید. سپس Parameters رو با استفاده از دستور Add پر کنید (باز هم خارج از حلقه):

cmd.Parameters.Add("@lessen", SqlDbType.Int);

سپس حلقه رو بدین شکل تغییر بدید:

for (int i = 0; i < dt.Rows.Count; i++)
{
student = Convert.ToInt32(dt.Rows[i][0]);
grade = text_key[i].Text;

cmd.Parameters["@lessen"] = lessen;
cmd.Parameters["@data"] = data1.ToLower();
cmd.Parameters["@student"] = student;
cmd.Parameters["@grade"] = grade.ToLower();

cmd.ExecuteNonQuery();
}


و سپس خارج از حلقه، Connection رو Close کنید. بدین ترتیب Performance برنامه به طرز قابل توجهی بالا میره. اما آیا باز هم راه بهتری برای اینکار نیست؟ البته که هست، البته بسته به تعداد Item ها داره.... اگر تعداد Item ها زیاد باشه، اونوقت میتونید تنها با یک Round Trip به سرور همین کارو انجام بدید. روش بدین شکل هستش که کلیه داده های مورد نظر رو بصورت XML به Stored Procedure ای سمت سرور می فرستید و Stored Procedure مورد نظر داده ها رو در یک Transaction (یا چندین Transaction، بسته به نیاز) در بانک درج میکنه. اینطوری برای چند هزار رکورد هم، فقط یک بار به سرور رجوع خواهید داشت (و نه چند هزار بار).

موفق باشید.

پاورقی: فراموش نکنید که کلاس SqlCommand، SqlConection و ... همه disposable هستن، به این معنا که در انتهای کار بهتره اونها رو Dispose کنید یا از using notation برای dispose کردن اونها استفاده کنید.

حسن رضازاده
سه شنبه 13 تیر 1391, 21:19 عصر
یه سوال داشتم ،اگه تعداد رکورد های من حدود 200 تا باشه ،چه روشی برای ارتباط با بانک اطلاعاتی بهتر هست ؟
ado.net یا linq یا xml یا ... ؟ کدومشون ؟
از نظر سرعت کدوم بیشتر است ؟ از نظر دقت و امنیت کدوم ؟

حسن رضازاده
سه شنبه 13 تیر 1391, 21:24 عصر
میبخشید ،اما این کدی که نوشتین خطا داره ،ارور میده !!!

cmd.Parameters["@lessen"] = lessen; cmd.Parameters["@data"] = data1.ToLower();
cmd.Parameters["@student"] = student;
cmd.Parameters["@grade"] = grade.ToLower();

mehdi.mousavi
سه شنبه 13 تیر 1391, 22:23 عصر
چه خطایی؟ دیگه لطفا هرگز در این سایت، یا هیچ جای دیگه، همینطوری نگید "Error داره" چون این عبارت هیچ کمکی نمیکنه و فقط زمان رو از دست خواهیم داد. در عوض بفرمایید "اینکارو کردم، فلان خطا رو بهم داد" و کل متن خطا رو اینجا درج کنید تا بشه به سوال پاسخ داد.

موفق باشید.

پاورقی: در مورد Performance در این مورد قبلا توضیح داده ام، لطفا در نوشته های قدیمی ترم جستجو کنید.