PDA

View Full Version : Syntax error in INSERT INTO statement



mohamad2007
جمعه 19 بهمن 1386, 08:20 صبح
با سلام خدمت دوستان عزیز
من یک Database با استفاده از Access ساختم که حاوی دو جدول یه نام های Accounts , Taken هست و با استفاده از دستورات مربوطه عملیاتی از قبیل درج و تغییر و حذف رکوردها رو انجام میدم. در مورد درج رکورد در جدول Accounts مشکلی ندارم ولی وقتی می خواهم در جدول Taken رکوردی درج کنم، خطا(Syntax error in INSERT INTO statement) میگیره!!!!
کدهایی که استفاده کردم به صورت زیر هستش:



con = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\database\Mydatabase.mdb")
Dim cmd As New OleDbCommand("INSERT INTO Takens("+...+ "')", con)
()con.Open
()cmd.ExecuteNonQuery
(da.Fill(ds
()con.Close



خطا:

از دوستان خواهش می کنم مرا راهنمایی کنند.

ghafoori
جمعه 19 بهمن 1386, 10:57 صبح
دوست عزیز شما انگار یک ' کم گذاشتید داخل این خط


Dim cmd As New OleDbCommand("INSERT INTO Takens('"+...+ "')", con)

maryam_vb
جمعه 19 بهمن 1386, 12:32 عصر
سلام
ساختار دستور insert به صورت زیر است:


Dim cmd As New OleDb.OleDbCommand("insert into tabelname(field1,filed2,...) values (داده2,داده 1 ,...)", conn)

مثال:


Dim comm As New OleDb.OleDbCommand("insert into class (name,family) values ('" & TextBox1.Text & " '
,'" & Textbox2.Text & "'
)", conn)

arashkey
جمعه 19 بهمن 1386, 12:43 عصر
لطفا یک مثال کوچک و مشابه برنامه خود قرار دهید. چون تشخیص مشکل شما به این شکل بسیار مشکل است.ولی در کل من پیشنهاد می کنم به جای اینکه مقادیر را مستقیما در داخل quarry خود درج کنید مانند شکل زیر


Dim ds As New Data.DataSet
Dim da As New OleDbDataAdapter
Dim con = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\database\Mydatabase.mdb")
Dim cmd As New OleDbCommand("INSERT INTO Takens('" & TextBox1.Text & "')", con)
Using con
con.Open()
cmd.ExecuteNonQuery()
da.Fill(ds)
End Using


از پارامتر استفاده کنید. احتمالا اگر سرچ کنید در مورد خواص استفاده از پارامتر مطالب بسیار زیادی پیدا خواهید کرد.
نمونه ای از استفاده از پارامتر ها در مثال زیر می بینید که بروی کد خود شما انجام شده است
در ضمن کار دستور da.Fill(ds کاملا نامشخص است. هدف خود را از استفاده از کد در برنامه مشخص کنید. من فقط کدتان را برای درج اطلاعات تغییر می دهم.(پیشنهاد می کنم یک تابع برای درج ویک تابع برای گرفتن اطلاعات داشته باشید تا از بهم ریختگی کد جلوگیری کنید)


Dim SQL As String = "INSERT INTO Takens(@str1)"
Dim con = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\database\Mydatabase.mdb")
Dim cmd As New OleDbCommand(SQL, con)
cmd.Parameters.AddWithValue("str1", TextBox1.Text)
Using con
con.Open()
cmd.ExecuteNonQuery()
End Using


تنها نکته قابل ذکر اینکه وقتی از متد (تابع) AddWithValue استفاده می کنید ، باید نوع پارامتر آن یعنی str1 که همان فیلد اول شما در بانک اطلاعاتی است با نوع پارمتر دوم یا همان TextBox1.Text مطابق باشد. یعنی فیلد اول در جدول شما باید از نوع رشته ای باشد تا اجرای این کد از شما خطا نگیرد. در صورت فیلدی مانند ID در جدول دارید که از نوع int است باید متغییر که به متد AddWithValue پاس داده می شود نیز از نوع عددی Integer باشد. یعنی در زمان اضافه کردن این پارامتر کد شما به شکل زیر در می آید


Dim SQL As String = "INSERT INTO Takens(@ID,@name)"
Dim con = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\database\Mydatabase.mdb")
Dim cmd As New OleDbCommand(SQL, con)
Dim intID As Integer = CInt(TextBox1.Text)
cmd.Parameters.AddWithValue("ID", intID)
cmd.Parameters.AddWithValue("name", TextBox2.Text)
Using con
con.Open()
cmd.ExecuteNonQuery()
End Using


که در این کد من فرض کردم شما جدولی به نام Takens دارید. که در داخل این جدول دو فیلد به نام ID از نوع int و Name از نوع String دارید.

maryam_vb
جمعه 19 بهمن 1386, 13:12 عصر
مشکل فقط تو سطر Insert Into هست.که فیلدها و مقادیر مربوط تعیین نشده.

اگه طبق ساختار صحیح دستور insert into کد نویسی شه مشکل برطرف میشه.

mohamad2007
جمعه 19 بهمن 1386, 18:12 عصر
با تشکر از همه دوستان...
کدی رو که استفاده کردم رو میزارم تا اشکالاتشو بر طرف کنید.






Dim cmd As New OleDbCommand("INSERT INTO Takens(account,date,time,paperno,Description,besta nkar,mande) values('" + txtAccount.Text + "','" + Form1.TextBox1.Text + "','" + System.DateTime.Now.Hour.ToString + ":" + System.DateTime.Now.Minute.ToString + "','" + "نقدی" + "','" + txtPrice.Text + "','" + Mande + "')", con)
con.Open()
cmd.ExecuteNonQuery()
con.Close()[/LEFT]

در ضمن جدول Taken از 8 فیلد به نام های Account, Date, Time, PaperNo,Description, Bedehkar, Bestankar, Mande تشکیل شده که Account از نوع Number و بقیه از نوع Text هستند.

raravaice
جمعه 19 بهمن 1386, 18:20 عصر
محمد جان

الحاق رشته ها در vb با "&" صورت میگیره و در #C با "+" ظاهرا شما داری از تلفیقی از اینا استفاده میکنی که نمیشه.

اگر داری با vb برنامت رو مینویسی از و میخوای دو تا string رو به هم متصل کنی از & استفاده کن برادر من.



"'" & Mande + "'"
یعنی چی؟ ;)

-----------------------------------------------------------------
یه چیز دیگه :

وقتی میخوای کلمات فارسی رو بفرستی تو بانکت از یه N استفاده کن یعنی :




N'نقدی'

mohamad2007
جمعه 19 بهمن 1386, 18:30 عصر
محمد جان

الحاق رشته ها در vb با "&" صورت میگیره و در #C با "+" ظاهرا شما داری از تلفیقی از اینا استفاده میکنی که نمیشه.

اگر داری با vb برنامت رو مینویسی از و میخوای دو تا string رو به هم متصل کنی از & استفاده کن برادر من.



"'" & Mande + "'"


یعنی چی؟ ;)

سلام دوست عزیز
شما درست می فرمایید...
من تازه کارم و هنوز تجربه زیادی ندارم و امیدوارم با کمک شما و دیگر دوستان، بتونم از تجربیات ارزشمندتون بهره مند بشم.
از راهنمایی و تذکرتون متشکرم.

mohamad2007
جمعه 19 بهمن 1386, 18:42 عصر
محمد جان

یه چیز دیگه :

وقتی میخوای کلمات فارسی رو بفرستی تو بانکت از یه N استفاده کن یعنی :




N'نقدی'


این کار رو هم کردم ولی بازم error میگیره.:گریه::عصبانی++:

raravaice
جمعه 19 بهمن 1386, 19:05 عصر
نوع فیلدهای بانکت رو بگو

account
date
time
paperno
Description
bestankar
mande

اینا هر کدوم از چه نوعی هستن؟

mohamad2007
جمعه 19 بهمن 1386, 19:12 عصر
نوع فیلدهای بانکت رو بگو

account
date
time
paperno
Description
bestankar
mande

اینا هر کدوم از چه نوعی هستن؟


account=Number
date=Text
time=Text
paperno=Text
Description=Text
bestankar=Text
mande=Text

raravaice
جمعه 19 بهمن 1386, 19:55 عصر
محمد جا شما 7 تا فیلد داری در صورتی که تو برنامت جوری نوشتی که داده ها برای 6 تا از فیلدها داره میره اگه دقت کنی یه جا توی sql query بین ساعت و دقیقه که از ":"استفاده کردی که مربوط به فیلد زمان هست که یا باید از "," استفاده کنی یا اینکه اطلاعات فیلد date رو یادت رفته وارد کنی.
برای account که از جنس number هست از کوتیشن استفاده نکن.

سعی کن account , date ,time رو بزاری توی براکت .

mohamad2007
شنبه 20 بهمن 1386, 07:10 صبح
با عرض سلام و تشکر خدمت دوستان:قلب:
مشکم حل شد... فقط در بانک اطلاعاتی اسم فیلد های Time,Date رو تغییر دادم.
فکر می کنم که این دو کلمه در SQL، کلمات کلیدی هستند.:اشتباه:
از همه عزیزانی که وقت گذاشتند و به من کمک کردند، تشکر می کنم.:تشویق:
در پناه حق.

parselearn
پنج شنبه 07 بهمن 1389, 15:40 عصر
محمد جا شما 7 تا فیلد داری در صورتی که تو برنامت جوری نوشتی که داده ها برای 6 تا از فیلدها داره میره اگه دقت کنی یه جا توی sql query بین ساعت و دقیقه که از ":"استفاده کردی که مربوط به فیلد زمان هست که یا باید از "," استفاده کنی یا اینکه اطلاعات فیلد date رو یادت رفته وارد کنی.
برای account که از جنس number هست از کوتیشن استفاده نکن.

سعی کن account , date ,time رو بزاری توی براکت .


آیا فیلد date حتما باید وارد شود
من این دستور را اجرا میکنم، اما خطا میدهد


sqlStatment = "INSERT INTO isar (radif,role,code,name,family,fathername,codemelli, nidentity,birthday,dieday,pcent,sex,married,bimety pe,nbime)" & _
" VALUES(1001,1,'122','a','b','c','092','220','1380/02/02','',0,'s1','m1','sad','5')"Data type mismatch in criteria expression.

مسئله این هست که فیلد dieday معلوم نیست!!! :لبخندساده:


و میخوام خالی باشه

bhasoft
شنبه 20 فروردین 1390, 19:59 عصر
سلام.دوست عزيز منهم مشكلي مثل مشكل شما داشتم.درضمن همه دستورات درج هم كاملا درست بود.
ولي من نامهاي جدول اكسس ام رو طوري طرح كرده بود كه همين اشكال رو ميگرفت.يعني بعد از 2روز امتحان كردن اخر مشكل رو پيدا كردم.شايد كمتر كسي به اين مشكل برخورده باشه.ولي من باهاش برخوردم.
توضيح اينكه اسم 1 فيلد من username بود و به خاطر همين نام اشكال سينتكس ميگرفت.
حالا شما فكر كنم نام فيلدهاتون date و time و account و Description را اگه عوض كنيد مشكل حل بشه.
راستش خودم گيج شدم كه از اسم فيلد باشه.اما دقيقا مشكل همون بود.
خواستم تجربه اي كه داشتمو در اختيارتون قرار بدم تا بلكه بدردتون بخوره.
درصورت حل شدم مشكل حتما پيغام بدين.ممنونم.