View Full Version : اشکال در یک برنامه تحت شبکه
salman_arak
دوشنبه 11 دی 1385, 14:13 عصر
با سلام
من تازه برنامه نویسی تحت شبکه رو شروع کردم پیشاپیش اگه سوالاتم پیش پا افتاده بود معذرت خواهی می کنم .
من تو یه برنامه ساده در سمت کلاینت می خواهم یکی از فیلدهای یکی از بانکهایم رو در سمت سرور پر کنم . این کار رو می خوام با یه query انجام بد م اما وقتی دستور زیر رو می نویسم پیغام خطائی مبنی بر نبودن بانک مورد نظر دریافت می کنم .
من برای ارتباط با سرور از کامپونت های زیر استفاده کرده ام و در برنامه سرور نیز کامپونت های که استفاده کرده ام در زیر می باشد . ارتباط با سرور رو با یه dbgridچک کرده ام اطلاعات بانک رو نشون می ده اما نوشتن توی بانکو خطا میگیره .
ممنونم .
MNosouhi
دوشنبه 11 دی 1385, 17:01 عصر
دلیل استفاده از Query در سمت کلاینت چیه؟ Query که نمیتونه به سرور وصل بشه ، پس چطور انتظار دارید بتونه بانک رو پیدا کنه؟
همون کد هایی رو که نوشتید به جای اینکه در Query بنویسید در ClientDataset بنویسید(در خاصیت CommandText ) . البته در Datasetprovider باید گزینه PoAllowCommandText رو True کنید.
salman_arak
سه شنبه 12 دی 1385, 07:30 صبح
با سلام
دوست عزیز راهنمایی های شما را اجرا کردم ولی با مشکل زیر مواجه شد م ممنونم اگه مرا راهنمایی کنی .
babak_delphi
سه شنبه 12 دی 1385, 07:36 صبح
با query هم کامل جواب میده
لطفا متن پیغام خطا رو برای زمانی که از query استفاده کردید رو هم بگید.
vcldeveloper
سه شنبه 12 دی 1385, 07:47 صبح
برای کارهایی مثل این من ترجیح میدم یک تابع در اینترفیس سرور تعریف کنم که پارامترهای کوئری را بگیره و کوئری را در سمت سرور اجرا کنه و موفقیت آمیز بودن عملیات را گزارش کنه.
از ClientDataSet هم برای کوئری هایی که Dataset بر می گردونن میشه استفاده کرد.
salman_arak
سه شنبه 12 دی 1385, 08:15 صبح
با سلام
از راهنمایی آقای کشاورز تشکر می کنم اما من توی این مقوله یک مبتدی هستم اگه میشه مطلب رو باز تر بفرمائید و اگه امکانش هست با مثال توضیح بدید ممنون میشم .
ممنون
salman_arak
سه شنبه 12 دی 1385, 08:25 صبح
با query هم کامل جواب میده
لطفا متن پیغام خطا رو برای زمانی که از query استفاده کردید رو هم بگید.
آقا بابک این پیغم خطائی که موقع استفاده از query میده .
mzjahromi
سه شنبه 12 دی 1385, 08:41 صبح
این یعنی اینکه مقدار خاصیت DataBaseName از Query تنظیم نشده است. اگر سه لایه کار میکنی در سمت کلاینت نیازی به TQuery نداری و همونطور که دوستمون گفتن باید از ClientDataSet استفاده کنی
salman_arak
سه شنبه 12 دی 1385, 09:00 صبح
این یعنی اینکه مقدار خاصیت DataBaseName از Query تنظیم نشده است. اگر سه لایه کار میکنی در سمت کلاینت نیازی به TQuery نداری و همونطور که دوستمون گفتن باید از ClientDataSet استفاده کنی
آقای جهرمی سلام
اگر سه لایه کار میکنی در سمت کلاینت نیازی به TQuery نداری
منظورتون رو از بیان این جمله نفهمیدم .
و خاصیت DataBaseName از Query اسم دیتا بیس منو نداره و فقط پیش فرضیات خودشه .
اگه امکانش هست توضیح دوست خوبمون اقای کشاورز رو کامل بفرمائید.
ممنون
mzjahromi
سه شنبه 12 دی 1385, 09:17 صبح
اگر بخواهید از روشی که آقای کشاورز گفتن استفاده کنید باید سمت سرور یک تابع تعریف کنید که عملیات مورد نظرتون رو انجام بده و از سمت کلاینت اون تابع رو کال کنید نحوه تعریف تابع در سرور به این شکل است(مطابق شکل ضمیمه)
و برای استفاده از اون تابع در کلاینت از کد زیر استفاده کنید
SocketConnection1.AppServer.Your FunctionName(Your Parameters)
salman_arak
سه شنبه 12 دی 1385, 09:52 صبح
:ناراحت: :ناراحت: :ناراحت: :ناراحت: :ناراحت:
دوباره سلام آقای جهرمی
منظور از مرحله اول رو نفهمیدم اما مرحله دوم رو تا ایجاد کردن متد دنبال کردم اما بعدش مثل ... تو گل موندم . من یه تازه کار تو این زمینه ام و این مراحل شمارو برای اولین باره که می بینم . با عرض شمرندگی بسیار از شما اگه بیشتر و ساده تر منو راهنمایی کنید ممنون میشم .
mzjahromi
سه شنبه 12 دی 1385, 10:59 صبح
شما که تا مرحله دوم رفتید دیگه نیازی به مرحله اول ندارید
ببینید این شکل میتونه شما رو راهنمائی کنه
این عملیات رو که انجام بدید توی یونیت مربوط به RemoteDataModule یک بدنه تابع ایجاد میشه که میتونید کدهاتون رو درون اون بنویسید
salman_arak
سه شنبه 12 دی 1385, 11:25 صبح
آقای جهرمی ازاینکه پیگیر رفع مشکل من هستید بسیار سپاسگزارم.
اول یه سوال کلی راجع به برنامه نویسی تحت شبکه بپرسم :
نوشتن query ها در برنامه کلاینت بهتر و سریعتر عمل می کنه یا در برنامه سرور ؟
و بعد :
فرمایش شما رو اجرا کردم : یه پارامتر بنام str گرفتم تا در اون رشته اس کیو الم رو ارسال کنم
و بعد کد زیر رو در اون متد نوشتم که خطا گرفت فکر کنم که هنوزم اون ضرب المثل چینی مثل ... تو گل موندن در مورد من صدق می کنه .
ممنون.
mzjahromi
سه شنبه 12 دی 1385, 11:37 صبح
نوشتن query ها در برنامه کلاینت بهتر و سریعتر عمل می کنه یا در برنامه سرور ؟
و بعد :
بستگی به شرایط داره
فرمایش شما رو اجرا کردم : یه پارامتر بنام str گرفتم تا در اون رشته اس کیو الم رو ارسال کنم
و بعد کد زیر رو در اون متد نوشتم که خطا گرفت فکر کنم که هنوزم اون ضرب المثل چینی مثل ... تو گل موندن در مورد من صدق می کنه .
پارامتر رو از نوع BSTR بگیرید
salman_arak
سه شنبه 12 دی 1385, 12:17 عصر
آقای جهرمی سلامی دوباره
این راهکار شما نتیجه داد و مشکلم رفع شد .
یکی از دوستان در این تاپیک در ابتدا راه حلی ارائه دادند که این راه حل رو من نتونستم به نتیجه برسونم :
همون کد هایی رو که نوشتید به جای اینکه در Query بنویسید در ClientDataset بنویسید(در خاصیت CommandText ) . البته در Datasetprovider باید گزینه PoAllowCommandText رو True کنید.
من این کارها رو انجام دادم ولی به خطای زیر برخوردم . کدی که نوشته ام در زیر آورده ام .
بار دیگر هم از توجه شما سپاسگزارم.
mzjahromi
سه شنبه 12 دی 1385, 12:33 عصر
این یعنی AdoQuery شما هم اکنون باز است و در حال استفاده.
نمی دونم قبل از اجرای این دستور با AdoQuery چه کاری رو انجام دادید ولی بعد از انجام کارهاتون با AdoQuery اون رو ببندید.
salman_arak
سه شنبه 12 دی 1385, 13:49 عصر
سلام
امروز خوب سرتونو درد آوردم آقای جهرمی
من خاصیت active . رو در Ado query که در ابتدا true کرده بودم رو false کردم و پیغام خطا دوباره عوض شد .
به نظر شما کدام ازاین دو تاروش بهتر است ؟
mzjahromi
سه شنبه 12 دی 1385, 14:07 عصر
من خاصیت active . رو در Ado query که در ابتدا true کرده بودم رو false کردم و پیغام خطا دوباره عوض شد .
بجای ClientDataSet1.Open یا ClientDataSet1.Active:=True از ClientDataSet1.Execute استفاده کنید
MNosouhi
سه شنبه 12 دی 1385, 14:58 عصر
برای استفاده از ClientDataset می تونید کد زیر رو امتحان کنید ، اون خطا مال موقعیه که به جای Execute از OPen یا Active:=True استفاده کرده باشید؟
ClientDataSet.Close;
ClientDataset.CommandText:=SqlStr;
ClientDataset.Execute;
با query هم کامل جواب میده
لطفا متن پیغام خطا رو برای زمانی که از query استفاده کردید رو هم بگید.
در این صورت شما باید با Query مستقینا به دیتابیس وصل بشید ، هدف از نوشتن برنامه جند لایه اینه که مستقیم وصل نشید.
vcldeveloper
چهارشنبه 13 دی 1385, 09:09 صبح
اون خطا مال موقعیه که به جای Execute از OPen یا Active:=True استفاده کرده باشید؟
وقتی query شما recordset ایی بر نمی گردونه (مثلا زمانی که از Insert, Delete یا Update استفاده می کنید)، باید از متد Execute بجای Open استفاده بشه.
mohsen_borzooei
شنبه 16 دی 1385, 07:52 صبح
سلام
در دنباله سوالات دوستمون
در این تاپیک فکر می کنم دو تا روش برای ذخیره اطلاعات تو بانک مطرح شد :
SocketConnection1.AppServer.Your FunctionName(Your Parameters)
روش دوم :
with ClientDataSet1 do
begin
Close;
CommandText:=str;
Execute;
end;
من دو روشو رو امتحان کردم درست جواب داد . تو برنامه من یه فرم ورود اطلاعات هست می خوستم ببینم کدوم روش رو انتخاب کنم بهتره از لحاظ سرعت - کارائی - مشغول کردن سرور و...
و سوال دوم اینکه چه طور می تونم بفهمم که عملیات مورد نظر روی بانک درست انجام شده و یا با خطا مواجه شده قبل از اینکه خود اس کیو ال سرور خطا بگیره .
با تشکر از دوستان .
mohsen_borzooei
یک شنبه 17 دی 1385, 08:56 صبح
:ناراحت:
هیشکی جواب این سوال مارو نداد . این تاپیک داشت یواش یواش از این صفحه می افتاد پائین .
اگه یکی از دوستان جواب ما رو بده ممنون می شم .
با تشکر.
vcldeveloper
یک شنبه 17 دی 1385, 09:05 صبح
من دو روشو رو امتحان کردم درست جواب داد . تو برنامه من یه فرم ورود اطلاعات هست می خوستم ببینم کدوم روش رو انتخاب کنم بهتره از لحاظ سرعت - کارائی - مشغول کردن سرور و...
روش اول رو من برای دستوراتی که RecordSet بر نمی گردونند پیشنهاد دادم. روش دوم هم (اگه واقعا نیاز دارید از CommandText استفاده کنید) برای دستوراتی که RecordSet برمی گردونند بهتره. البته ممکن این مسئله با توجه به نوع و کاربرد پروژه تغییر کنه.
و سوال دوم اینکه چه طور می تونم بفهمم که عملیات مورد نظر روی بانک درست انجام شده و یا با خطا مواجه شده قبل از اینکه خود اس کیو ال سرور خطا بگیره .
اگه تابع در سمت سرور تعریف شده، می تونید متغیری رو باهاش برگشت بدید که صحت عملیات رو مشخص کنه. برای ClientDataSet هم می تونید از رویدادهاش استفاده کنید، یا کدها رو در بلوک های try..except قرار بدید تا در صورت وقوع خطا بتونید قبل از نمایش پیغام خطا، خطا رو مدیریت کنید.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.