PDA

View Full Version : خطا در درج رکورد



rsalimian
دوشنبه 27 بهمن 1382, 21:14 عصر
جدول tblTopic با کلید ID از نوع autonumber
هنگام درج رکورد با کوری زیر:


string strInsertQuery = "insert into tblTopic(ID,title,fk_UserId) values('" +
txtTitle.Text + "','" + strUser + "')";
خطای زیر را میدهد:


Exception Details: System.Data.OleDb.OleDbException: Number of query values and destination fields are not the same.

راه حل چیست؟

SoheilKH
سه شنبه 28 بهمن 1382, 00:10 صبح
احتیاجی به نوشتن Id نیست اون رو بردار درست می شود
در ضمن اون طور نوشتن دستورات sql صحیح نیست
توصیه میکنم یه سری به مقاله sql enjection که آقا وحید زحمت تدوین اون را کشیدند بزنید

rsalimian
سه شنبه 28 بهمن 1382, 07:33 صبح
ID را هم اگه بردارم بازم همین خطا را میده.
آقای خسروی اگه میشه ایراد کوری را بگید. :)

Vahid_Nasiri
سه شنبه 28 بهمن 1382, 07:55 صبح
جواب:
http://help2.hostway.com/documents/winplatform/online/Ch0612.html

rsalimian
سه شنبه 28 بهمن 1382, 10:08 صبح
ممنون آقای نصیری.
ولی مشکل اینه که من نمی خواهم مقدار فیلد ID را خودم تعیین کنم چون autonumber هستش. من یه کاما اضافی هم گذاشتم بدون تعیین مقدار id بصورت زیر ولی نشد:
string strInsertQuery = "insert into tblTopic(ID,title,fk_UserId) values(,'" +
txtTitle.Text + "','" + strUser + "')";
(با عرض پوزش بخاطر اینکه سوال را اشتباها در این تاپیک گذاشتم)

SoheilKH
سه شنبه 28 بهمن 1382, 11:52 صبح
این کد را امتحان کن


string strInsertQuery = "insert into tblTopic(title,fk_UserId) values(
txtTitle.Text + "','" + strUser + "')";


فیلدی را که AutoNumber کردی احتیاجی به مقدار دادن آن نیست .

رضا جان امکان دارد که مقداری که به فیلد fk_UserId می دهید با نوع این فیلد مغایرت داشته باشد (احتمال می دهم)

اگر احتمال می دهی که دستور sql ات اشتباه است توی کوئری انلایزر اس کیو ال ات را امتحان کن.
مطمئنا جواب می گیری

rsalimian
سه شنبه 28 بهمن 1382, 12:35 عصر
جناب سهیل خان,
اگر فیلد ID را مقدار ندهم یا اصلا در کوری قرار ندهم باز هم خطا می دهد.
کوری درست است و موقعی که برای ID مقدار مشخص کنم رکورد ایجاد می شود.
به خاطر اینکه گفته بودید "در ضمن اون طور نوشتن دستورات sql صحیح نیست " من ازتون خواسته بودم اشکال کوری را بگید.

SoheilKH
سه شنبه 28 بهمن 1382, 12:58 عصر
خوب زودتر بگو جوون
بهتره از استور پروسیجر ها استفاده کنی( به خاطر سرعت بالاتر) یا اینکه با پارامتر متغییر هایت رو به sql ات اعمال کنی.
کار کردن با پارامتر ها خیلی راحت تر و روتین تر است
این جور نوشتن دستورات sql امکان هک را بالا می برد.
قبلا هم عرض کردم خدوتتون
یه سری به مقاله sql Enjection بزنید می فهمی داری چه ریسکی می کنی

rsalimian
سه شنبه 28 بهمن 1382, 13:22 عصر
فرمایش شما کاملا صحیح است. مقاله آقای نصیری را هم در مورد Sql Injection خواندم. دست استاد درد نکنه.
من یادم رفته بود بگم که تو این کد بانک من اکسس2000 است. :oops:

Vahid_Nasiri
سه شنبه 28 بهمن 1382, 20:20 عصر
1- همانطور که گفته شده نیازی به درج فیلد اوتونامبر نیست ( خودبخود انجام می شود )
2- اگر متن انگلیسی دارید تایپ می کنید و یا وارد می کنید عموما سینگل کوت ها مشکل ایجاد می کنند که باید حذف شوند

در ضمن عبارات sql ربطی به نوع دیتابیس انجین شما ندارد و در این حد استاندارد هستند و باید باشند.

rsalimian
چهارشنبه 29 بهمن 1382, 07:58 صبح
:( میدونم که autonumber نباید در کوری قرار داده بشود. ولی اگه فیلد id را نگذارم بازم خطا میده که تعداد پارامتر ورودی کم است.

Vahid_Nasiri
چهارشنبه 29 بهمن 1382, 17:51 عصر
لطفا این قسمت برنامه را اینجا ضمیمه کن. به همراه دیتابیس خالی آن

rsalimian
جمعه 01 اسفند 1382, 16:18 عصر
پروژه نمونه وب اپلیکیشن
نام بانک forum.mdb

Vahid_Nasiri
جمعه 01 اسفند 1382, 20:23 عصر
هنگامی که نمی خواهید فیلد اوتونامبر را بکار برید باید نام فیلدها را در کوئری ذکر کنید تا اشتباه اینگونه صورت نگیرید البته اکسس اینگونه است و گرنه شعور اس کیوال سرور خیلی بالاتر از این حرفها است.


string strInsertQuery = "insert into tblTopic(Title,fk_UserId) values('" +
txtTitle.Text + "','" + strUser + "')";

rsalimian
شنبه 02 اسفند 1382, 07:41 صبح
درست می فرمایید آقای نصیری. ولی من بااین حالت هم جواب نگرفتم :(

Vahid_Nasiri
شنبه 02 اسفند 1382, 07:54 صبح
من تست کردم بعد نوشتم

rsalimian
سه شنبه 05 اسفند 1382, 08:20 صبح
با تشکر.
این حالت قبلا جواب نمی داد ولی حالا جواب گرفتم :oops: