PDA

View Full Version : سوال: ذخیره اطلاعات یک فرم در دو جدول پایگاه



mehrdad85
سه شنبه 19 بهمن 1389, 10:11 صبح
سلام
دوستان ممنون میشم کسی اگه میتونه کمکم کنه


مشکلی که من باهاش روبرو شدم اینه که من یه فرم ساده دارم که کاربر باید یه سری اطلاعات وارد کنه ولی این اطلاعات گرفته شده در دو جدول پایگاه داده باید ذخیره بشه
خب بدیهی هستش که دو تا جدول پایگاه داده من باید با هم از طریق یه فیلد خارجی ارتباط برقرار کنند تا اینجای کار هیچ مشکلی نیست مشکل از جایی شروع میشه که کلید اصلی یکی از جداول دارای identity specification هستش یعنی خودش داخل sql مقدار میگیره و نیازی نیست ما بهش مقدار بدیم چطور میتونم وقتی کاربر دکمه تایید را کلیک کرد به این کلید خارجی مقدار بدم؟

امیدوارم تونسته باشم منظورمو خوب بیان کنم

دوستان اگه میشه فوری کمکم کنین چون این پروژه باید مدت ها پیش تموم میشد ولی همچنان...



مرسی

بانوآفتاب
سه شنبه 19 بهمن 1389, 10:57 صبح
اگه منظورتون اينه كه ميخواهيد توي برنامه ات آيدي توليد شده توري sql را داشته باشي ، ميتوني اين كار رو بكني
1. توي پروسيجر insert يه پارامتر خروجي براي id بگيري ، مثلاً
@id BIGINT OUTPUT
2. بعد از دستور insert اين پارامتر رو مقدار بدي ، به اين صورت
SET @id = SCOPE_IDENTITY()
و توي .net مقدار اين پارانتر خروجي رو بگيري، به اين صورت
1. تعريف پارامتر به صورت خروجي


cmd_save_head.Parameters.Add(new SqlParameter() { ParameterName = "@id", SqlDbType = SqlDbType.BigInt, Direction = ParameterDirection.Output });

2. بعد از اجراي cmd_save_head


id = Convert.ToInt64(cmd_save_head.Parameters["@id"].Value);

mehrdad85
سه شنبه 19 بهمن 1389, 11:37 صبح
با سلام به بانو آفتاب!!!:لبخندساده:

یه چیزو باز تاکید کنم که این دو تا جدول هم زمان از طریق داده های وارد شده در یک فرم تکمیل میشن و به یکدیگه کلید خارجی دارن
یعنی همزمان باید دو تا جدول پر بشن و یکی از جدولا به فیلد identity specification کلید خارجی تولید کنه

مرسی

niloofar100
سه شنبه 19 بهمن 1389, 17:17 عصر
دوست عزيز كامل متوجه سوالت نشدم ولي با اين كد مي توني اطلاعاتت رو توي ديتابيس با كليك روي دكمه ذخيره كني
SqlConnection con = new SqlConnection(@"Data Source=GN-SNUTMPBI\SQLEXPRESS;Initial Catalog=travel;Integrated Security=True");
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandType = CommandType.Text;
cmd.CommandText = "insert into sabt(name,family,gender,company,email,tel,fax,subj ect)values('" + TextBox1.Text + "','" + TextBox2.Text + "','" + DropDownList1.Text + "','" + TextBox3.Text + "','" + TextBox4.Text + "','" + TextBox5.Text + "','" + TextBox6.Text + "','" + DropDownList2.Text + "')";
con.Open();
cmd.ExecuteNonQuery();
con.Close();

masoudasgari
شنبه 30 بهمن 1389, 12:58 عصر
سلام دوست عزیز این دستور آخرین Identity در sql رو برمیگردونه
SELECT @@Identity as 'Identity'

mehrdad85
شنبه 30 بهمن 1389, 14:19 عصر
سلام
دوستان بابت جواب دادن و وقت گذاشتنتون ممنون
لطف کردید
فقط یه سوال دارم و اون این که اصلا یه label مقدار نمیگیره
من برای برگردوندن مقدار از این کد استفاده کردم

SqlConnection scon = new SqlConnection(ConfigurationManager.ConnectionStrin gs["RegistrationConnectionString"].ToString());
SqlCommand scom1 = new SqlCommand("SELECT MAX(compId) FROM Properties", scon);
scon.Open();
scom1.ExecuteNonQuery();
int compIdQuery = (int)scom1.ExecuteScalar();
compIdQuery += 1;
IDLbl.text = compIdQuery.ToString;

البته query را داخل خود sql server تست کردم و درست کار میکنه از بابت syntax هم مطمئن هستم ولی نمیدونم چرا جواب نمیده
اخیر حتی مقدار دستی مثلا "ffff" را به خصوصیت text اون label تاثیری نداره و انگار نه انگار که مقدار دهی شده این خصوصیت
اصلا انگار لیبل را invisible کردیم


کسی میتونه کمکم کنه؟


مرسی

javad.nic63
شنبه 30 بهمن 1389, 17:23 عصر
اینطوری مقداردهی کن ببین جواب میگیری؟


SqlConnection scon = new SqlConnection(ConfigurationManager.ConnectionStrin gs["RegistrationConnectionString"].ToString());
SqlCommand scom1 = new SqlCommand("SELECT MAX(compId) as maximum FROM Properties", scon);
scon.Open();
SqlDataReader dr=scom1.ExecuteReader();
if (dr.HasRows)
{
dr.Read();
int compIdQuery = Convert.ToInt32(dr["maximum
"])


}

compIdQuery +=1;
IDlbl.Text = compIdQuery.Tostrin();



اگه جواب نداد یه پروژه جدید ایجاد کن ببین اصلاً این کار رو بکنی انجام میشه یا نه؟
یه چیز دیگه رو هم تست کن ببین رنگ lableت همرنگ با زمینه نباشه؟

mehrdad85
یک شنبه 01 اسفند 1389, 09:55 صبح
سلام
دوست عزیز از نظر رنگ که مشکلی نبود
از اون نظر هم چرا باید داخل یه پروژه دیگه کار نکنه؟
مگه نمیشه که خصوصیت text مربوط به یه label را در code behind مقدار دهی کرد؟
عرض کردم ، من حتی اگه اونا با یه string ساده هم مقدار دهی کنم باز هم چیزی را نشون نمیده مثلا اگه بنویسم :

IDLbl.text ="fff"
باز هم تاثیری نداره
کدی هم که زحمت کشیده بودید تست کردم اگرچه از بابت کوئری و مباحث دیگش مطمئن هستم که درست کار میکنه

چیزی به نظرتون نمیرسه؟

A.S.Roma
یک شنبه 01 اسفند 1389, 10:03 صبح
احتمال فراوان شما در یک Event دیگه ( یا یه جای دیگه ) دارید Label رو خالی می کنید یا Visibility اون رو تغییر میدید یا کلا" از دسته موارد.

می تونید بعد از Render شدن پیج از داخل سورس چک کنید که آیا مقدار نگرفته یا کلا" وجود نداره .
یا با Break Point روال لود صفحه رو چک کنید.

یا نهایتا" کل کدهای فایل aspx , CodeBehind رو اینجا قرار بدید بررسی شه .

mehrdad85
یک شنبه 01 اسفند 1389, 10:20 صبح
با break point چطوری میتونم روال لود صفحه را ببینم؟

A.S.Roma
یک شنبه 01 اسفند 1389, 10:29 صبح
اگر از Event هایی که قبل از Page_Load‌فایر می شوند استفاده نکرده اید ، روی خط اول Page_Load دکمه F9 را بزنید و سپس F5 بزنید. بعد از Stop شدن برنامه در خط مذکور با F7 پیش بروید.