ورود

View Full Version : مشکل با دستور insert



soft-c
دوشنبه 21 تیر 1389, 14:41 عصر
سلام.
یک برنامه دارم که یکی از فرم های آن ذخیره نامه است .
دستور ذخیره ی اطلاعات به این صورت است :

ADOQuery1.Close ;
ADOQuery1.SQL.Clear ;
ADOQuery1.SQL.Add('insert into nameh(be,az,title,number,date,matn)values ('+QuotedStr ( edit1.Text)+' , '+QuotedStr(edit2.Text )+','+QuotedStr(edit3.Text )+' , '+ edit4.Text +' , '+SolarDatePicker1.Text+', image1.picture)');
ADOQuery1.ExecSQL ;
ولی erro می گیره .
فیلدهای پایگاه sql :
be:nvarchar
az:nvarchar
title:nvarchar
number:nvarchar
date:char
matn:binary

lena abbaszadeh
دوشنبه 21 تیر 1389, 15:01 عصر
ولی erro می گیره .
خب چه errorای میده؟:متفکر:

pezhvakco
دوشنبه 21 تیر 1389, 17:42 عصر
درود :
1 - ستون number شما از نوع nvarchar است و باید مانند سه ستون قبلی مقدار دهی شود .
2 - برای ستون date هم همین طور است .
3 - برای مقدار دهی ستون matn دستور image1.picture رو نوشتی . این مقدار رو SQL از کجا باید بیاره .

فکر خوش .

Mohsen.Rasti
سه شنبه 22 تیر 1389, 01:19 صبح
Missing operator or semicolon من هم ای اساتید این پیغام رو دریافت می کنم
لطفا راهمایی بفرمایید

mohsensaghafi
سه شنبه 22 تیر 1389, 02:05 صبح
سلام دوست عزیز.
شما در هنگام کد نویسی در گذاشتن تعداد مناسب علامت (') دچار اشکال شده اید. برای اینکه بدانید مشکل کجاست، ابتدا query مورد نظرتون رو درون یک edit چاپ کنید و سپس آنرا بصورت دستی درون دیتابیش اجرا کنید. احتمالا به این روش هم ایراد می گیرد. چون درون SQL در دو طرف یک رشته باید علامت (') وجود داشته باشد که شما در این query آنها را لحاظ نکرده اید.
موفق باشید و پیروز

soft-c
سه شنبه 22 تیر 1389, 08:56 صبح
سلام.

شما در هنگام کد نویسی در گذاشتن تعداد مناسب علامت (') دچار اشکال شده اید. برای اینکه بدانید مشکل کجاست، ابتدا query مورد نظرتون رو درون یک edit چاپ کنید و سپس آنرا بصورت دستی درون دیتابیش اجرا کنید. احتمالا به این روش هم ایراد می گیرد. چون درون SQL در دو طرف یک رشته باید علامت (') وجود داشته باشد که شما در این query آنها را لحاظ نکرده اید.
موفق باشید و پیروز
می شه بگید منظور از کم بودن ( ' ) کجاست . اگر منظورتان image است وقتی ( ') می گذارم error می گیرد .
ولی در یک فرم دیگه همین دستورات را نوشتم و لی error نگرفت البته آنجا عکس و تاریخ نداشت .

3 - برای مقدار دهی ستون matn دستور image1.picture رو نوشتی . این مقدار رو SQL از کجا باید بیاره .
میشه بگین برای این مشکل باید چه کار کرد ؟

خب چه errorای میده؟:متفکر:
ماشا لا هر دفعه یک error می دهد .
یک بار به اطلاعات ورودی از edit ، یک بار به نوع تبدیل و.....
ولی من بیشتر فکر می کنم مشکل روی عکس و تاریخ باشه .
تشکر از راهنماییهای همه دوستان.

soft-c
سه شنبه 22 تیر 1389, 09:34 صبح
سلام دوستان.
من کدها را به این صورت تغییر دادم و لی در پایگاه در فیلد متن null ذخیره می شود .

ADOQuery1.Close ;
ADOQuery1.SQL.Clear ;
ADOQuery1.SQL.Add('insert into nameh(be,az,title,number,date)values ('+QuotedStr ( edit1.Text)+' , '+QuotedStr(edit2.Text )+','+QuotedStr(edit3.Text )+' , '+ edit4.Text +' , '+SolarDatePicker1.Text+')');
ADOTable1.Insert ;
TBlobField (ADOTable1.FieldByName('matn')).LoadFromFile(OpenD ialog1.FileName );
ADOQuery1.ExecSQL ;

soft-c
سه شنبه 22 تیر 1389, 10:26 صبح
سلام .
من به یک جایی از کد بالا رسیدم و آن اینکه در پایگاه ابتدا اطلاعات insert اول را وارد می کند و بعد اطلاعات عکس را .برای همین دو رکورد وارد می شود که در رکورد اول فیلد matn دارای مقدار null است و در رکورد دوم فیلد matn دارای مقدار <binary data> است و بقیه فیلدها null می گیرند و این یعنی گرفتن فضای جدول .
لطفا راهنمایی کنید .

bootshow
پنج شنبه 24 تیر 1389, 17:30 عصر
کد زیر را امتحان کن
if OpenDialog1.Execute then
begin
ADOQuery1.Close ;
ADOQuery1.SQL.Clear ;
ADOQuery1.Parameters.Clear;
ADOQuery1.Parameters.AddParameter.Name:='pic';
ADOQuery1.SQL.Add('insert into nameh(be,az,title,number,date,matn)values ('+
QuotedStr ( edit1.Text)+' , '+QuotedStr(edit2.Text )+','+
QuotedStr(edit3.Text )+' , '+ edit4.Text +' , '+
SolarDatePicker1.Text+' ,:pic'+')');
ADOQuery1.Parameters.ParamByName('pic').LoadFromFi le(OpenDialog1.FileName,ftBlob);
ADOQuery1.ExecSQL ;
end;

mohsensaghafi
جمعه 25 تیر 1389, 22:05 عصر
دوست عزیز.
در دستورات SQL برای ارسال رشته ها شما باید از علامت ' استفاده کنید. به عنوان مثال به کد زیر دقت کنید.

insert into table_name (fild1) values ('ali')
در دو طرف ali باید از علامت ' استفاده کنید.
اگر در کد هم مجبور به استفاده از ' هستید حتما به ' های SQL هم دقت کنید.
موفق و پیروز

soft-c
شنبه 23 مرداد 1389, 18:38 عصر
کد زیر را امتحان کن
if OpenDialog1.Execute then
begin
ADOQuery1.Close ;
ADOQuery1.SQL.Clear ;
ADOQuery1.Parameters.Clear;
ADOQuery1.Parameters.AddParameter.Name:='pic';
ADOQuery1.SQL.Add('insert into nameh(be,az,title,number,date,matn)values ('+
QuotedStr ( edit1.Text)+' , '+QuotedStr(edit2.Text )+','+
QuotedStr(edit3.Text )+' , '+ edit4.Text +' , '+
SolarDatePicker1.Text+' ,:pic'+')');
ADOQuery1.Parameters.ParamByName('pic').LoadFromFi le(OpenDialog1.FileName,ftBlob);
ADOQuery1.ExecSQL ;
end;
سلام .
فکر کنم جواب داد ولی چند تا سوال دارم :
1- در sql در فیلدی که عکس ذخیره می شه این عبارت تایپ شده <Binary data> . آیا صحیح است ؟
2- برای بازیابی عکس از چه کدی استفاده کنم ؟
3-با چه پسوندهایی می تواند ذخیره شود ؟
4-اگر من بخواهم به دو روش نامه را ذخیره کنم یکی همین روش عکس و دیگری با استفاده ار rich edit (یعنی ذخیره خود متن نامه ) ، آنوقت جدول پایگاه را به نظر شما چطوری طراحی کنم که حداقل افزونگی را داشته باشد ؟
تشکر.

soft-c
یک شنبه 24 مرداد 1389, 15:31 عصر
کسی می تونه در این مورد کمک کنه ؟

pezhvakco
یک شنبه 24 مرداد 1389, 18:06 عصر
1 - آره درسته ؟
2 - اگه منظورت از بازیابی نمایش عکسه که می تونی از DBImage استفاده کنی .
3 - بیش تر پسوند ها رو پشتیبانی میکنه .
4 - چرا به دو روش ؟
هم عکس و هم متن . برای حالت متن از varchar یا nvarchar استفاده کن .

soft-c
یک شنبه 24 مرداد 1389, 23:48 عصر
1 - آره درسته ؟
2 - اگه منظورت از بازیابی نمایش عکسه که می تونی از DBImage استفاده کنی .
3 - بیش تر پسوند ها رو پشتیبانی میکنه .
4 - چرا به دو روش ؟
هم عکس و هم متن . برای حالت متن از varchar یا nvarchar استفاده کن .
سلام .
تشکر از راهنماییهاتون.
منظورم از شماره 4 این است که اگر من دوتا فیلد که کی از نوع nvarchar است و یکی از نوع image داشته باشم ، وقتی فایل من از نوع image باشه خوب فیلد متن من خالی است و بالعکس
حالا می خواستم بدانم آیا راهی است که بشه جلوی این افزونگی را گرفت ؟
تشکر.

pezhvakco
دوشنبه 25 مرداد 1389, 08:53 صبح
آیا راهی است که بشه جلوی این افزونگی را گرفت ؟
وقتی دو نوع ستون مختلف تعریف کردی، هیچ راهی نمونده .

بدرود .

kamran_dev
دوشنبه 25 مرداد 1389, 09:56 صبح
حالا می خواستم بدانم آیا راهی است که بشه جلوی این افزونگی را گرفت ؟


میتونی فایل های image رو توی یک جدول دیگه بزاری و از طریق یک Id بهش رفرنس بدی.

Arman_1367
دوشنبه 25 مرداد 1389, 12:11 عصر
یک راه حل این است که از فیلد Binary استفاده کنید و برای اینکه اطلاعات را ذخیره و بازیابی کنید از یک TMemoryStream در کد دلفی خودتون استفاده نمایید. و برای حل مشکل اینکه تشخیص بدهید که آیا متن بوده یا عکس می توانید در ابتدای شئی TMemoryStream خود یک متغییر Boolean ذخیره نماییدو در هنگام بازیابی ابتدا آن را خوانده و بعد با توجه به مقدار آن اطلاعات را نمایش دهید اما لازم می دانم ذکر کنم این روش باعث می شود در صورتی که بخواهید با استفاده از دستورات Select دنبال متن خاصی در نامه بگردید با مشکل مواجه شوید البته اگر کمی تحقیق کنی در SQLServer می توانید از داده های XML استفاده کنید که این مشکل را برای شما به راحتی حل می کند.