PDA

View Full Version : سوال: دستور insert



petros
سه شنبه 01 بهمن 1387, 00:51 صبح
سلام
من تو یه برنامه ساده تست دستورات دیتا بیس برای دستور insert کد پایین رو نوشتم ولی ارور میده لطفا" کسی اگه میدونه مشکل کجاست دریغ نکنه
(برنامه میخواد که چند تا مقدار رو از تکست باکس بگیره بریزه تو جدول )
SqlConnection cnn = new SqlConnection("server=(LOCAL);uid=sa;pwd=;database=clinic-db");
SqlDataAdapter da = new SqlDataAdapter("select * from Ill", cnn);
String insertcmd = "INSERT INTO Ill VALUES (" + txtpid.Text.Trim() + "," + txtpname.Text.Trim() + "," +
txtplname.Text.Trim() + "," + txtpbday.Text.Trim() + "," + txttelno.Text.Trim() + "," + txtgen.Text.Trim() +
"," + txtcity.Text.Trim() + "," + txtcdate.Text.Trim() + "," + txtuc.Text.Trim() + ")";
SqlCommand cmd = new SqlCommand(insertcmd, cnn);

cmd.Connection.Open();
cmd.ExecuteNonQuery();
cmd.Connection.Close();

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
ارورشم بعد کلیک باتون اینه:

The name 'ali' is not permitted in this context. Only constants, expressions, or variables allowed here. Column names are not permitted.
(ali اسمیه که تو تکست باکس وارد میشه)
با تشکر

iman_ad
سه شنبه 01 بهمن 1387, 01:37 صبح
کلا این نوع کار شما حرفه ای نیست باید از parameter استفاده کنی این جور query درست کردن صحیح نیست.
قبل از trim به string تبدیل کن مشکل cast داری.
مثلا


TextBox1.Text.ToString().Trim()

WorldVbMan
سه شنبه 01 بهمن 1387, 08:17 صبح
با سلام
ضمن تأكید بر فرمایش استادمون استفاده از StroredProcedure و pass كردن پارامتر باون، بیشتر مورد تأییده با این وجود من فكر می كنم ایراد از اینه كه استرینگها رو در ' نگذاشتید یعنی اگه مثلاً بنویسید :
insert into Ill values('ali', ...
درست شه چون یك استرینگه نه عدد و یا اسم متغیر لذا باید در ' قرار گیرد
البته نظر من اینه كه انشاء ا... مشكل حل شه

mh19842008
سه شنبه 01 بهمن 1387, 10:12 صبح
obj_Command.CommandText = "INSERT INTO Ill VALUES(@نام فیلد دوم@,نام فیلد اول,...)"
obj_Command.Parameters.AddWithValue("@نام فیلد اول", TextBox1.Text)
obj_Command.Parameters.AddWithValue("@نام فیلد دوم", TextBox2.Text)
.
.

دستور درح رو به این تغییر بده درست میشه
موفق باشید

petros
سه شنبه 01 بهمن 1387, 17:36 عصر
با سلام
ضمن تأكید بر فرمایش استادمون استفاده از StroredProcedure و pass كردن پارامتر باون، بیشتر مورد تأییده با این وجود من فكر می كنم ایراد از اینه كه استرینگها رو در ' نگذاشتید یعنی اگه مثلاً بنویسید :
insert into Ill values('ali', ...
درست شه چون یك استرینگه نه عدد و یا اسم متغیر لذا باید در ' قرار گیرد
البته نظر من اینه كه انشاء ا... مشكل حل شه





با تشکر از توجهی که کردین

ولی من میخوام متنی که تو تکس باکس هستش رو اینزرت کنم . لطفا" در موردش بیشتر توضیح بدین.ممنون میشم.

petros
سه شنبه 01 بهمن 1387, 17:56 عصر
obj_Command.CommandText = "INSERT INTO Ill VALUES(@نام فیلد دوم@,نام فیلد اول,...)"
obj_Command.Parameters.AddWithValue("@نام فیلد اول", TextBox1.Text)
obj_Command.Parameters.AddWithValue("@نام فیلد دوم", TextBox2.Text)
.
.

دستور درح رو به این تغییر بده درست میشه
موفق باشید

آقا دمت گرم این روشی که گفتی obj_Command از چه نوعیه؟ چجوری باید اجراش بکنم.

milade
سه شنبه 01 بهمن 1387, 18:23 عصر
این کار با پارامترها انجام میشه !
یعنی اینکه شما در @x رو پاس میدید اما مقدار اون ثبت میشه
این روش بسار عالی برای جلوگیری از هک هستش
اجرا هم مثل معموله ، فقط همون پارامترها متفاوته ، شما مثل قبلا" SqlCommand رو اجا کنید
(جستجو کنید)
موفق باشید

mh19842008
سه شنبه 01 بهمن 1387, 19:16 عصر
همونطور که دوستمون گفتند obj_Commandاز نوع sql command هستش
وبقیه راهش رو بلدی اگر مشکلی داشتی بگو تا کمکت کنیم
موفق باشی

petros
سه شنبه 01 بهمن 1387, 19:47 عصر
همونطور که دوستمون گفتند obj_Commandاز نوع sql command هستش
وبقیه راهش رو بلدی اگر مشکلی داشتی بگو تا کمکت کنیم
موفق باشی

ممنون از لطفی که در حق من میکنید
من اجراش میکنم تو cmd.Connection .Open ();
این ارور رو میده

Object reference not set to an instance of an object

البته obj_Command رو به cmd تغییر دادم

mh19842008
سه شنبه 01 بهمن 1387, 20:01 عصر
چرا یک متغیر از نوع sql connection نمیگیری

Dim conn As New Data.SqlClient.SqlConnection
conn.Open()
Dim cmd As New Data.SqlClient.SqlCommand("کوئری", conn)
البته این پیغامت Object reference not set to an instance of an object
بخاطر عدم وجود مقداره
اگه مشکلی بود بگو

WorldVbMan
سه شنبه 01 بهمن 1387, 20:10 عصر
با تشکر از توجهی که کردین

ولی من میخوام متنی که تو تکس باکس هستش رو اینزرت کنم . لطفا" در موردش بیشتر توضیح بدین.ممنون میشم.

خواهش می كنم
ببینید شما واسه اینكه در كوئری مشخص كنید كه مقادیری كه دارید می دید نوعشون رشته است نه چیز دیگه باید استرینگ ها رو در دو تا ' بگذارید. خب من مثالی كه زدم واسه یه متن عادی بود بجای كلمه ی علی میشه گذاشت:
insert into Ill (FildNames,...) values ("'"+TextBox1.Text.Trim()+"'", ...
باین ترتیب كوئری نهایی با تایپ كلمه ی علی در كنترل متن میشه اونی كه اول نوشته بودم
برای اعداد نباید از ' استفاده بشه
البته گفتم كلاً استفاده از این نوع كوئری ساختن چندان امن نیست ضمن اینكه سرعت كمتری هم داره چون هر بار باید كامپایل شه توسط Sql با این حال اگه سؤال دیگه ای بود در خدمتم

mh19842008
سه شنبه 01 بهمن 1387, 20:23 عصر
اینم مطالعه کنی بد نیست

petros
سه شنبه 01 بهمن 1387, 23:52 عصر
مغسیدست گلت درد نکنه آقا mh19842008 مشکلم حل شد

بیسیار بیسیار ممنون

petros
چهارشنبه 02 بهمن 1387, 00:10 صبح
اینم کدی که کار میکنه(البته یه کم با اونی که شما گفتین جای کوتیشن ها فرق میکنه(بازم یه دنیا ممنون از اینکه وقت گذاشتین و لطف کردین)):

SqlConnection cnn = new SqlConnection("server=(LOCAL);uid=sa;pwd=;database=clinic-db");
SqlDataAdapter da = new SqlDataAdapter("select * from Ill", cnn);
String insertcmd = "INSERT INTO Ill(ill_id,ill_name, ill_lname, ill_birthday, ill_tel, ill_jen, ill_city,user_code ) VALUES ("+ txtpid.Text.Trim()+ ",'" + txtpname.Text.Trim() + "','" +
txtplname.Text.Trim() + "','" + txtpbday.Text.Trim() + "','" + txttelno.Text.Trim() + "','" + txtgen.Text.Trim() +
"','" + txtcity.Text.Trim() + "','" + txtuc.Text.Trim() + "')";

SqlCommand cmd = new SqlCommand(insertcmd, cnn);

cmd.Connection.Open();
cmd.ExecuteNonQuery();:
cmd.Connection.Close();

این کد رو برای آموزش کد اسکیوال برا چندتا از بچه ها میخواستم . که تو یه پروژه عملن ببینن.