PDA

View Full Version : مشکل تفاوت sql در dbisam و bde



jalilmousavi
چهارشنبه 23 فروردین 1391, 11:19 صبح
باسلام خدمت اساتید محترم سایت وزین برنامه نویس. بنده برنامه ای دارم که بانک اطلاعاتی آن paradox است و به دلیل مشکلات مربوط به استفاده همزمان چند برنامه از یک بانک که در paradoxپیش می آید تصمیم گرفتم که بانک اطلاعاتی برنامه ام را به dbisam تغییر بدهم. چون راحت بصورت client/server در می آید و مشکل خراب شدن اطلاعات آن خیلی کم است. اما مشکل جدیدی که پیش آمده از این قرار است که جملات sql که در paradox یا به عبارتی در Bde کار می کنند در dbisam کار نمی کنند به عنوان مثال :
select t1.f1,count(t1.f1)*cast(t2.f2 as integer) from t1,t2 where t1.f1=t2.f2 group by t1.f1 order by t1.f1

در موقع اجرای این کد در dbsys.exe که از برنامه های جانبی dbisam است پیام زیر را می دهد:

DBISAM Engine Error # 11949 SQL parsing error - Invalid use of non-aggregated column in expression in SELECT SQL
statement at line 1, column 31

و نشانگر متن در اول t2.f2 (قرمز شده) قرار می گیرد که t2.f2 فرضا عددی است که بصورت string در بانک ذخیره شده است.
حال اگر بجای t2.f2 مثلا بنویسیم '12' جمله مذبور کار می کند اما در حالت قبلی خطای بالا را میدهد.

اساتید لطف کرده و کمک کنند مشکل حل شود.
باتشکر :قلب:

jalilmousavi
یک شنبه 27 فروردین 1391, 08:04 صبح
از اساتید کسی نیست راهنمایی کنه؟

mohsen24000
یک شنبه 27 فروردین 1391, 08:19 صبح
چرا از Absolute Database استفاده نمی کنید...
Key Features:

· No BDE; no DLLs
· SQL'92 (DDL & DML) support
· Single database file
· Unmatched ease-of-use
· 100% compatibility with standard DB-aware controls
· Strong encryption
· BLOB compression
· Full source code available
· Royalty-free

jalilmousavi
یک شنبه 27 فروردین 1391, 09:24 صبح
[QUOTE=mohsen24000;1485350]چرا از Absolute Database استفاده نمی کنید...
[LTR]Key Features:

با تشکر از توجه و جواب شما.از کجا میشه دانلودش کرد؟
البته dbisam خاصیت client/server شدن هم داره که فکر نکنم این مورد که شما گفتین داشته باشه.

mohsen24000
یک شنبه 27 فروردین 1391, 10:34 صبح
نسخه multi user این کامپوننت امکان client/server رو هم به شما میده...
http://www.componentace.com/download/?c=1

سعید صابری
یک شنبه 27 فروردین 1391, 12:42 عصر
البته نباید از Mysql گذشت مخصوصا از سرعتش و رایگان بودنش و... .

mohsen24000
یک شنبه 27 فروردین 1391, 12:45 عصر
البته نباید از Mysql گذشت مخصوصا از سرعتش و رایگان بودنش و... .
فرمایش شما متین! ولی بحث Stand Alone هم مطرحه...

jalilmousavi
یک شنبه 27 فروردین 1391, 15:11 عصر
باسلام خدمت اساتید محترم سایت وزین برنامه نویس. بنده برنامه ای دارم که بانک اطلاعاتی آن paradox است و به دلیل مشکلات مربوط به استفاده همزمان چند برنامه از یک بانک که در paradoxپیش می آید تصمیم گرفتم که بانک اطلاعاتی برنامه ام را به dbisam تغییر بدهم. چون راحت بصورت client/server در می آید و مشکل خراب شدن اطلاعات آن خیلی کم است. اما مشکل جدیدی که پیش آمده از این قرار است که جملات sql که در paradox یا به عبارتی در Bde کار می کنند در dbisam کار نمی کنند به عنوان مثال :
select t1.f1,count(t1.f1)*cast(t2.f2 as integer) from t1,t2 where t1.f1=t2.f2 group by t1.f1 order by t1.f1

در موقع اجرای این کد در dbsys.exe که از برنامه های جانبی dbisam است پیام زیر را می دهد:

DBISAM Engine Error # 11949 SQL parsing error - Invalid use of non-aggregated column in expression in SELECT SQL
statement at line 1, column 31

و نشانگر متن در اول t2.f2 (قرمز شده) قرار می گیرد که t2.f2 فرضا عددی است که بصورت string در بانک ذخیره شده است.
حال اگر بجای t2.f2 مثلا بنویسیم '12' جمله مذبور کار می کند اما در حالت قبلی خطای بالا را میدهد.

اساتید لطف کرده و کمک کنند مشکل حل شود.
باتشکر :قلب:

منظور کلی من حل مشکل قید شده بود که تاپیک بخاطر آن ایجاد شده است. وقتی count(t1.f1)*cast(t2.f2 as integer) را به دو قسمت ,count(t1.f1) , cast(t2.f2 as integer) جدا می کنم مشکلی پیش نمیاد اما با ترکیب تابع count با cast خطا میده که در بالا قید شده. این خطا در paradox نمیده و کار می کنه اما dbisam نه. شاید این مشکل در بانکهای دیگه ای که عزیزان معرفی می کنند هم پیش بیاید.(پرانتزها بدلیل ویرایش سایت قاطی شده اند و فرمول مشکل پارانتزی ندارد)

fahimi
یک شنبه 27 فروردین 1391, 16:49 عصر
برای بررسی بیشتر نمونه ای از کد را به همراه تیبل dbisam آپولود کنید.
راستش من بیش پنج شش برنامه با dbisam نوشته ام مشکل خاصی بر نخورده ام

mohsen24000
یک شنبه 27 فروردین 1391, 16:50 عصر
این طور بنویس ببین مشکلت حل میشه!

select t1.f1,count(t1.f1)*(select cast(t2.f2 as integer) from t2 where t2.f2=t1.f1) from t1 group by t1.f1 order by t1.f1

jalilmousavi
سه شنبه 29 فروردین 1391, 09:21 صبح
برای بررسی بیشتر نمونه ای از کد را به همراه تیبل dbisam آپولود کنید.
راستش من بیش پنج شش برنامه با dbisam نوشته ام مشکل خاصی بر نخورده ام

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

select

m.pergrp,io.iocr

/* this formula is ok: ,count(m.pergrp)*cast('1' as integer) */

,count(m.pergrp)*cast(io.iocr as integer)

from "c:\M12" as m
,"c:\io12" as io

where io.iono=m.iono

group by m.pergrp,io.iocr

order by m.pergrp

m.pergrp عددی و از نوع integer است و iono هم همینطور . iocr هم رشته است که یک حرفی است و فقط اعداد 0 تا 9 در ان ریخته می شوند.
لازم به ذکره که قسمتی که قرمز و بولد کرده ام کار می کنه اما وقتی بجای '1' می نویسم io.iocr یا هر فیلد دیگه از هر جدولی، خطا می دهد که در بالا به آن خطا اشاره شد.
ضمن تشکر منتظر راهنمایی شما عزیزان هستم.

jalilmousavi
سه شنبه 29 فروردین 1391, 09:23 صبح
این طور بنویس ببین مشکلت حل میشه!

select t1.f1,count(t1.f1)*(select cast(t2.f2 as integer) from t2 where t2.f2=t1.f1) from t1 group by t1.f1 order by t1.f1

با سلام و تشکر اینطوری هم نوشتم ولی فرقی نکرد . بعد از select دوم درخواست بستن پرانتز باز می کنه. در کل فکر نکنم این موردی که شما نوشتین عملی باشه. بازم از توجهتون ممنونم.

jalilmousavi
سه شنبه 29 فروردین 1391, 09:31 صبح
البته من میتوانم فرمول را اینطور بنویسم (قسمت بولد شده) :

select

m.pergrp,io.iocr

,count(m.pergrp) , cast(io.iocr as integer)

from "c:\M12" as m
,"c:\io12" as io

where io.iono=m.iono

group by m.pergrp,io.iocr

order by m.pergrp

و بعد چون فرمول به دوتا فیلد شکسته شده است (قسمت بولد شده) مثلا در گزارش گیری و غیره بیام و دوباره اون دوتا فیلد را در هم ضرب کنم.
اما سوالم اینه که چرا با وجودی که عمل ضرب در جمله ,count(m.pergrp)*cast(io.iocr as integer) در پاردوکس کار می کنه در dbisam کار نمیکنه . همچنین چرا وقتی بجای io.iocr در جمله فوق می نویسیم '1' کار می کنه : ,count(m.pergrp)*cast('1' as integer)

mohsen24000
سه شنبه 29 فروردین 1391, 09:32 صبح
این select رو در Absolute Database تست کردم و جواب داد و پیام خطایی رو هم که گفتید نمیده...
مشکل یا از کدهای شماست یا DBIsam!!!

jalilmousavi
سه شنبه 29 فروردین 1391, 10:05 صبح
این select رو در Absolute Database تست کردم و جواب داد و پیام خطایی رو هم که گفتید نمیده...
مشکل یا از کدهای شماست یا DBIsam!!!

ممنو از زحمتتون
همونطور که قبلا نوشتم این کد در bde کاملا کار می کنه و جواب مورد انتظار را میده اما در dbisam خطایی را که در بالا نوشتم میده . اگه پست شماره 13 را خونده باشین اونجا نوشته ام که با عوض کردن io.iocr با مثلا '1' خطا نمیده . حالا موندم که فرق dbisam در این مورد با bde یا Absolute Database چیه که خطا میده. چون شما نوشتین که در Absolute Database کار می کنه و خطا نمیده پس لاجرم کد از نظر کلی مشکلی نداره.
حال منتظرم ببینم اساتید محترم نظرشون چیه.
در ضمن جناب mohsen24000 در صورتی که برای جنابعالی امکان پذیر باشد این کد یا کد مشابه را در dbisam نیز تست فرمائید.
با تشکر.

fahimi
چهارشنبه 30 فروردین 1391, 18:42 عصر
منظورم این بود که یک نمونه کوچک از تیبل و سورس را ایجاد و کد مربوط را آپولود میکردی تا در در عمل خطا مورد برسی قرار می گرفت

jalilmousavi
پنج شنبه 31 فروردین 1391, 16:57 عصر
منظورم این بود که یک نمونه کوچک از تیبل و سورس را ایجاد و کد مربوط را آپولود میکردی تا در در عمل خطا مورد برسی قرار می گرفت

شما راحت می توانید یک جدول با هر فیلدی که دوست دارید بسازید. فقط باید یکی از فیلدها integer و دیگری string باشد. در اولی یک عدد و در دومی هم رشته عددی مثلا 1 یا 21 یا خلاصه یک عددی بنویسید بعد پرس و جو را اجرا کنید. سورس sql همان است که در بالا نوشته شده است. هدف فقط ترکیب توابع cast و count می باشد.

jalilmousavi
شنبه 02 اردیبهشت 1391, 16:36 عصر
به عنوان نمونه به کد زیر توجه فرمائید که در bde بخوبی اجرا می شود اما در dbisam با وجود خطا ندادن به نظر می آید که dbsys.exe هنگ می کند :

select m.*,ps.pername+' '+ps.perfamily as pernm
from "E:\My_project\mealP\PayTollDBIsam\OutPut\DB1390\Ma in\M900521" as m
,"E:\My_project\mealP\PayTollDBIsam\OutPut\DB1390\pe rsonal" as ps
where m.perno=ps.perno

لازم به ذکر است که فیلد perno در دو بانک m900521 و personal مشترک است که بتوان از روی آن نام و فامیل را بدست آورد.
به نظر اساتید علت این نا هم خوانی بین bde و dbisam چیست؟

fahimi
شنبه 02 اردیبهشت 1391, 16:44 عصر
مشکل شما subquery است که متاسفانه dbisam از آن پشتیبانی نمی کند

jalilmousavi
شنبه 02 اردیبهشت 1391, 20:57 عصر
مشکل شما subquery است که متاسفانه dbisam از آن پشتیبانی نمی کند

فرمایش شما متین . اما چرا کد زیر اجرا میشه؟

select m.*,io.iotitle

from "E:\My_project\mealP\PayTollDBIsam\OutPut\DB1390\Ma in\M900520.dat" as m
,"E:\My_project\mealP\PayTollDBIsam\OutPut\DB\iono" as io

where io.iono=m.iono

order by m.pergrp

jalilmousavi
پنج شنبه 07 اردیبهشت 1391, 00:26 صبح
به عنوان نمونه به کد زیر توجه فرمائید که در bde بخوبی اجرا می شود اما در dbisam با وجود خطا ندادن به نظر می آید که dbsys.exe هنگ می کند :

select m.*,ps.pername+' '+ps.perfamily as pernm
from "E:\My_project\mealP\PayTollDBIsam\OutPut\DB1390\Ma in\M900521" as m
,"E:\My_project\mealP\PayTollDBIsam\OutPut\DB1390\pe rsonal" as ps
where m.perno=ps.perno

لازم به ذکر است که فیلد perno در دو بانک m900521 و personal مشترک است که بتوان از روی آن نام و فامیل را بدست آورد.
به نظر اساتید علت این نا هم خوانی بین bde و dbisam چیست؟

با سلام کد نوشته شده اجرا میشود اما سرعتش خیلی کند است . در Bde راحت و سریع است اما در dbisam با همان دیتا سرعت خیلی کند است تا جایی که ادم خیال می کند هنگ کرده است. آیا راهی برای سرعت بخشیدن به اجرا هست؟

jalilmousavi
پنج شنبه 07 اردیبهشت 1391, 16:35 عصر
اساتید محترم برای اینکه راحت تر بتوانند تست کنند کافی است جمله پرس و جوی زیر را در dbisam تست کنند:

select

p1.perno,p2.pername


from "personal" as p1 ,"personal" as p2

where p1.perno=p2.perno

order by p1.perno

در این حالت زمان اجرا در dbisam خیلی طولانی است اما در bde خیلی سریع است. علت این تفاوت چیست؟
فرقی نمی کند از یک بانک پرس و جو شود یا دوتا . در هر حال مثل موارد بالا سرعت اجرای پرس و جو نسبت به bde خیلی خیلی کم است. من خوانده بودم که dbisam بانک سریعی است.