PDA

View Full Version : اشکال در فرمان select در سی شارپ



morva14
سه شنبه 10 دی 1387, 16:16 عصر
سلام .
من یک جدول رو از پایگاه داده فراخونی کردم به شرط اینکه فیلد name مساوی مهدی و فیلد Family مساوی شریفی باشه اما هنگامی که دیتا آداپتر میخواد اطلاعات رو داخل دیتا تیبل پر کن یه کادر sqlException باز میشه و این دو تا اخطار رو می زنه invalid column name 'مهدی'
invalid column name 'شریفی'

این هم کد :


string command = "select * from Customers where Name=" + txtName.Text + " and Family=" + txtFamily.Text + " and RoomNumber=" + txtRoomNumber.Text;
DataTable dt = newDataTable();
SqlDataAdapter da = newSqlDataAdapter(command, ConnectionClass.conn);
ConnectionClass.conn.Open();
dt.Clear();
da.Fill(dt); اینجا خطا میگیره

dark-man
سه شنبه 10 دی 1387, 17:51 عصر
سلام .
من یک جدول رو از پایگاه داده فراخونی کردم به شرط اینکه فیلد name مساوی مهدی و فیلد Family مساوی شریفی باشه اما هنگامی که دیتا آداپتر میخواد اطلاعات رو داخل دیتا تیبل پر کن یه کادر sqlException باز میشه و این دو تا اخطار رو می زنه invalid column name 'مهدی'
invalid column name 'شریفی'

این هم کد :
string command = "select * from Customers where Name=" + txtName.Text + " and Family=" + txtFamily.Text + " and RoomNumber=" + txtRoomNumber.Text;
DataTable dt = newDataTable();
SqlDataAdapter da = newSqlDataAdapter(command, ConnectionClass.conn);
ConnectionClass.conn.Open();
dt.Clear();
da.Fill(dt); اینجا خطا میگیره


سلام فرمان select ی که نوشتی یکم اشتباه داره به جای * نام دو تا فیلد رو که می خوای روش کار کنی بنویس مثلا" :




"select field_A, field_B from tb_sample where field_A " = + textbox1.text + "and password" = +textbox2.text



مطلب دیگه هم اینکه اون دو تا مقدار داخل فیلدها رو قبلا" باید توی جدول قرار بدی . امیدوارم این کمکت کنه :لبخندساده:

shervin_agh67
سه شنبه 10 دی 1387, 20:01 عصر
نه به * ربطی نداره به صورت زیر بنویسش :


"SELECT * FROM Customers WHERE [name]='"+txtName.Text+"'AND ... "
مشکل تو اینه که تکست باکست رو باید بین دو علامت ' و ' قرار بدی تا برنامه رشته رو اشتباهی به جای پارامتر در نظر نگیره . این جور دستورات رو هر وقت گیر کردی اگه با Access کار می کنی یک Query جدید ایجاد کن و داخلش دستورت رو بنویس و خروجیش رو تست کن کارت رو راحت تر می کنه . با SQL هم مشابه همینه .
ولی سعی کن با پارامتر کار کنی مطمئن تره .

ennovation
سه شنبه 10 دی 1387, 20:27 عصر
سلام
1. یه نگاهی به جدولی که داری بنداز و نگاه کن که نام فیلدهایی که دادی دقیقا درست نوشته شده اند و شاید در جدول از حروف کوچک استفاده کردی (name )و در دستور select از حروف بزرگ (Name) .

اگه درست بود باید بگم که
2. همانطور که گفته شد علامت * ربطی به این خطا نداره
3. راه حل دوم صحیح است

"SELECT * FROM Customers WHERE [name]='"+txtName.Text+"'AND ... " ولی به یک شرط کار میکنه اونم اینه که قبل از تمامی
"AND" ها
یک فاصله هم بذاری "'AND '" در غیر اینصورت هنگام اجرا این دستور and به نام قبلی میچسبد و باعث خطا میشود.

shervin_agh67
سه شنبه 10 دی 1387, 22:19 عصر
همیشه سعی کن نام جداولت رو در '[' و ']' بگذاری این کار زمانی سودمنده که در نام جدولت کاراکتر فاصله وجود داشته باشه مثلا (last name) . در اینصورت برنامه خطا می گیره و حتما باید از علامات بالا استفاده کنی ([last name]). البته طراحی یک همچین بانکی کار زیاد حرفه ای و جالبی نیست ولی خوب توی پروژه ها زیاد دیده میشه.

morva14
چهارشنبه 11 دی 1387, 00:49 صبح
نه به * ربطی نداره به صورت زیر بنویسش :



"SELECT * FROM Customers WHERE [name]='"+txtName.Text+"'AND ... "
مشکل تو اینه که تکست باکست رو باید بین دو علامت ' و ' قرار بدی تا برنامه رشته رو اشتباهی به جای پارامتر در نظر نگیره . این جور دستورات رو هر وقت گیر کردی اگه با Access کار می کنی یک Query جدید ایجاد کن و داخلش دستورت رو بنویس و خروجیش رو تست کن کارت رو راحت تر می کنه . با SQL هم مشابه همینه .




ولی سعی کن با پارامتر کار کنی مطمئن تره .



ممنونم از کمکتون مشکلم حل شد

morva14
چهارشنبه 11 دی 1387, 01:11 صبح
ببخشید اون خطا رو دیگه نمیده یعنی از دستور da.fill(dt) رد میشه اما هیچ رکوردی و بر نمی گردونه در صورتی که من توی دیتابیسم اون رکورد رو دارم . ولی دستور select رو که فقط با یک شرط انجام میدم یعنی بدون AND رکورد مورد نظر رو میاره . لطفا کمکم کنید.

ghabil
چهارشنبه 11 دی 1387, 02:16 صبح
میخوای قبل از AND یک فاصله بزاری بعد دوباره تست کنی؟

morva14
چهارشنبه 11 دی 1387, 14:32 عصر
میخوای قبل از AND یک فاصله بزاری بعد دوباره تست کنی؟

این کار رو هم کردم نشد

araelectronic@ymail.com
چهارشنبه 11 دی 1387, 23:57 عصر
با سلام
لطفا اگه ميتونيد كدتونو بذاريد تا شايد بشه كمك كرد

morva14
پنج شنبه 12 دی 1387, 00:22 صبح
با سلام
لطفا اگه ميتونيد كدتونو بذاريد تا شايد بشه كمك كرد

کد قسمت بالای تاپیک گذاشتم

araelectronic@ymail.com
پنج شنبه 12 دی 1387, 01:13 صبح
دوست عزيز منظورم كدتون بعد از اعمال تغييرات و رفع erorr

morva14
پنج شنبه 12 دی 1387, 14:06 عصر
دوست عزيز منظورم كدتون بعد از اعمال تغييرات و رفع erorr


string command = "select * from Customers where [Name]='" + txtName.Text + "' and [Family]='" + txtFamily.Text + "' and [RoomNumber]='" + txtRoomNumber.Text + "'";
SqlDataAdapter da = newSqlDataAdapter(command, ConnectionClass.conn);
DataTable dt = newDataTable();
ConnectionClass.conn.Open();
dt.Clear();
da.Fill(dt);

قبلا اینجا خطا می گرفت ولی الان توی گریدویو جدول رو میاره ولی مقداری نداره در صورتی که وقتی همون رکورد و با شماره اتاق جستجو میکنم هیچ مشکلی نیست


ConnectionClass.conn.Close();

araelectronic@ymail.com
پنج شنبه 12 دی 1387, 17:12 عصر
با سلام
دوست عزيز از فرمان trim قبل از textbox استفاده كنيد به احتمال زياد نامي كه وارد ميكنيد با چيزي كه داخل ديتابيس است كمي متفاوت است.

shervin_agh67
جمعه 13 دی 1387, 16:15 عصر
مشکلت اینه که برای فیلد شماره اتاق هم جفت علامت '' رو به کار بردی این علامات رو فقط برای عبارات رشته ای باید بکار ببری . البته اگه این فیلد نوعش رشته ای نیست :


"select * from Customers where [Name]='" + txtName.Text + "' and [Family]='" + txtFamily.Text + "' and [RoomNumber]=" + txtRoomNumber.Text ;

shervin_agh67
جمعه 13 دی 1387, 16:18 عصر
اگه از SQL 2005 یا 2000 داری استفاده می کنی احتمالا مشکل حرف 'ی' رو پیدا می کنی اگه با نکته ای که بالا گفتم مشکلت رفع نشد احتمالا همین مشکل رو داری.

علیرضا مداح
جمعه 13 دی 1387, 16:38 عصر
سلام دوست عزیز،
این شیوه ی کدنویسی و ساخت کوئری به هیچ عنوان توصیه نمی گردد و پایین ترین حد امنیت را دارا میباشد،
پیشنهاد میکنم که بر روی Parameterized Query کار کنید تا برای پاس دادن مقادیر به کوئری با مشکل روبرو نشده و همچنین از خطر حمله ی SQL Injection نیز تا حد زیادی در امان بمانید، البته توصیه میگردد که از Stored Procedures استفاده نمایید و در غیر اینصورت از فرمان sp_executesql جهت اجرای Parameterized Query مورد نظر بهره بگیرید،/

پ.ن : لطفا" کدهای خود را داخل تگ [code] قرار دهید ،/

morva14
شنبه 14 دی 1387, 00:04 صبح
اگه از SQL 2005 یا 2000 داری استفاده می کنی احتمالا مشکل حرف 'ی' رو پیدا می کنی اگه با نکته ای که بالا گفتم مشکلت رفع نشد احتمالا همین مشکل رو داری.

مشکل من اینجاست که وقتی توی Query Analyzer هم با اسامی فارسی select میزنم هیچ رکوردی نمیاره مثل select * from customers where Name = 'رضا'
ولی وقتی با اسمامی لاتین select میکنم رکورد مورد نظر رو میاره
مثل select * from customers where Name = 'reza'

علیرضا مداح
شنبه 14 دی 1387, 12:47 عصر
دوست عزیز شما باید پیش از رشته ی فارسی خود، یک حرف N قرار دهید، بدینصورت:


SELECT * FROM Customers
WHERE [Name] = N'رضا';

piroozman
دوشنبه 22 تیر 1388, 22:53 عصر
ببخشید اون خطا رو دیگه نمیده یعنی از دستور da.fill(dt) رد میشه اما هیچ رکوردی و بر نمی گردونه در صورتی که من توی دیتابیسم اون رکورد رو دارم . ولی دستور select رو که فقط با یک شرط انجام میدم یعنی بدون AND رکورد مورد نظر رو میاره . لطفا کمکم کنید.
وقتی می خواهی تکستهای که به صورت یونیکد هستند به دیتابیس بفرستی و بر اساس آنها جستجویی ر ا انجام بدی بایستی از حرف بزرگ N قبل از ارسال هر گونه مقدار فیلدی استفاده کنید. در این مورد به خصوص به صورت زیر عمل کن:

select * from customers where name =N'"txtNmae.Text" and . . .
لازم به ذکر است که Sql به بزرگ و کوچک بودن حروف حساس نیست. هر طور که دوست داری کد را بنویس. اما همانطور که گفتم کلمه N نقش بسیار زیادی در درست وارد شدن مقادیر در دستور دارد. اما من همیشه از پروسیجر یا فانکشن ها استفاده می کنم و مقادیر خودم را به صورت پارامتر به sql می فرستم.