PDA

View Full Version : سوال: مشكل طولاني بودن عبارت SQL به خاطر اسم فيلدها طولاني



ali_abbasi22145
یک شنبه 29 آذر 1388, 14:13 عصر
سلام
من با ADO خود دلفي 7 به بانك SQL SERVER 2000 وصل مي شوم.
من اسم فيلدها كامل در جدول تعريف كردم و همه اسم فيلدها طولاني است و اگر مثلا اگر در دستور SQL زير number_of_print را اضافه مي كنم خطا مي دهد.
QryDate.Active := False;
QryDate.SQL.Clear;
QryDate.SQL.Add('select sicard,first_name,last_name,father_name,employee_n umber,id,title,department,sex,date_of_birth_sh,exp ire_date_card_sh,expire_date_of_employment_sh,prin t_date_sh,card_format from cardtable where expire_date_card < DateAdd(day,-1,GETDATE())');
QryDate.Active := True;
خطاي زير:
[Error] Search_With_Date_Unit.pas(366): String literals may have at most 255 elements

سعید صابری
یک شنبه 29 آذر 1388, 16:45 عصر
مجبور نيستي يكبار از QryDate.SQL.Add استفاده كني كد ها تقسيم كن و از چند بار آنها را اد كن




QryDate.SQL.Add('Select sicard,first_name,last_name,father_name,employee_n umber,id,title,department')
QryDate.SQL.Add('sex,date_of_birth_sh,exp ire_date_card_sh,expire_date_of_employment_sh,prin t_date_sh,card_format from cardtable where expire,')

benyaminrahimi
یک شنبه 29 آذر 1388, 17:51 عصر
مي توني تو يک متغيير widestring بريزي بعد اون متغيير رو بهش کني

q.sql.add(parametr)

ali_abbasi22145
دوشنبه 30 آذر 1388, 15:16 عصر
مي توني تو يک متغيير widestring بريزي بعد اون متغيير رو بهش کني

q.sql.add(parametr)
يك مثال از روشان بي زحمت اينجا مي گذاريد!

حسین شهریاری
سه شنبه 01 دی 1388, 09:01 صبح
سلام

من رشته هایی که حدود چهار برابر هم بزرگتر از رشته شما است را بدون هیچ گونه مشکلی به Query ارسال و پاسخ گرفتم.البته من با Add این کار را نمیکنم.من رشته مورد نظر را مستقیما به خاصیت Text نسبت میدم.

مثلا:

AdoQuery.Sql.Text:='select * from Orders
AdoQuery.close
AdoQuery.open'
تا حالا هم مشکلی نداشتم.شما هم از این روش استفاده کن ببین جواب میده یا نه؟

alinikaein
سه شنبه 01 دی 1388, 10:29 صبح
سلام

من رشته هایی که حدود چهار برابر هم بزرگتر از رشته شما است را بدون هیچ گونه مشکلی به Query ارسال و پاسخ گرفتم.البته من با Add این کار را نمیکنم.من رشته مورد نظر را مستقیما به خاصیت Text نسبت میدم.

مثلا:

AdoQuery.Sql.Text:='select * from Orders
AdoQuery.close
AdoQuery.open'تا حالا هم مشکلی نداشتم.شما هم از این روش استفاده کن ببین جواب میده یا نه؟

روش دوست خوبم آقاي شهريار كه گفته كاملاً درسته و هيچ مشكلي هم نداره به خاطر اين كه در دستور Add بايد حتماً از رشته‌هاي با طول حداكثر 255 كاراكتر استفاده كرد ولي در Text، اين محدوديت وجود نداره.

ali_abbasi22145
دوشنبه 07 دی 1388, 11:26 صبح
سلام و تشكر
تستش مي كنم و چه فرقي بين AdoQuery.Sql.Text و QryDate.SQL.Add وجود دارد؟

ali_abbasi22145
سه شنبه 08 دی 1388, 10:35 صبح
سلام
Text هم دقيقا همانا خطا را مي دهد!

QryDate.Active := False;
QryDate.SQL.Clear;
QryDate.SQL.Text := 'select sicard,first_name,last_name,father_name,employee_n umber,id,title,department,sex,date_of_birth_sh,exp ire_date_card_sh,expire_date_of_employment_sh,prin t_date_sh,card_format from cardtable where expire_date_card < DateAdd(day,-1,GETDATE()) ';
QryDate.Active := True;

bootshow
چهارشنبه 09 دی 1388, 00:19 صبح
من از dbisam استفاده میکنم.یک بانک 350 فیلدی دارم که با حلقه for (البته بعضیوقتها) دستور sql درست میکنم و اونو اجرا میکنم. میتونی از کامپوننتهای دیگری استفاده کنی

ali_abbasi22145
سه شنبه 22 دی 1388, 08:55 صبح
مجبور نیستی یکبار از QryDate.SQL.Add استفاده کنی کد ها تقسیم کن و از چند بار آنها را اد کن




QryDate.SQL.Add('Select sicard,first_name,last_name,father_name,employee_n umber,id,title,department')
QryDate.SQL.Add('sex,date_of_birth_sh,exp ire_date_card_sh,expire_date_of_employment_sh,prin t_date_sh,card_format from cardtable where expire,')


متشكر
با روش شما مشكل حل شد!

ehsan_ei
چهارشنبه 11 فروردین 1389, 10:32 صبح
سلام دوستان:
من هم همین مشکل رو دارم.
در واقع رشته ی من یک دستور SQL هست. یه قسمت از کدم رو براتون می نویسم:

کد:

var temp,sherkatname:string;
begin
sherkatname:=combobox1.Text;
temp:='select edareh.sherkatname, edareh.shomaretarh, edareh.shomaredasturekar, name.fname, name.lname, mahdude.khiaban, mahdude.kuche from edareh, name, mahdude where edareh.shomaretarh=name.shomaretarh and edareh.shomaretarh=mahdude.shomaretarh and edareh.sherkatname=';
temp:=temp+QuotedStr(sherkatname);
adoQuery1.SQL.Add(temp);


متغییر temp رو که از نوع string تعریف کردم 266 تا کاراکتر داره. واین ارور رو میده:


String literals may have at most 255 elements

با هر دو روشی که تو این تاپیک گفته شد کار کردم ولی بازم ارور میداد. میشه راهنماییم کنیین و بگین که باید کدم رو چه جوری بنویسم؟؟؟

nilidelphi
دوشنبه 16 فروردین 1389, 11:49 صبح
دوستان گرامی من یه پیشنهاد دارم ولی ربطی به دلفی نداره

اگه دوست دارید میتونید امتحان کنید :

اولا نمیدونم که این روش در SQL Server 2000 هست یا نه ولی تو ورژن 2005 و 2008 حتما وجود داره
تو این ورژن ها امکاناتی به نام synonyms وجود داره که به شما این امکان رو میده که برای هر جدول یا موجودیت دیگر یک اسم مترادف تعریف کنید و بجای عبارت طولانی اسم واقعی از یک کلمه ی کوتاه استفاده کنید.