PDA

View Full Version : سوال: ReturnValue برای Query



bmanfy
دوشنبه 21 بهمن 1387, 09:09 صبح
سلام دوستان .
من دورن یک کوئری چنتا دستور نوشتم و یک سری مقادیر رو به سورت پارامتر به اون ارسال میکنم .
اما خوب حالا لازمه یه مقداری هم برگشت داده بشه . مثلا مثل Error@@ .
توی نوع پارامتر نوع های ReturnValue , out و ... رو دیدم . اما هر کاری کردن نتونستم از اونها استفاده کنم .
ممنون میشم اگر در این زمینه منو راهنمایی کنید .

vcldeveloper
دوشنبه 21 بهمن 1387, 17:23 عصر
اما هر کاری کردن نتونستم از اونها استفاده کنم .
یعنی دقیقا چی کار کردید؟

bmanfy
سه شنبه 22 بهمن 1387, 18:30 عصر
یعنی دقیقا چی کار کردید؟


کارهای متعددی انجام دادم .
مثلا یک پارامتر به صورت معمولی تعریف کردم با استفاده از دو نقطه . بعدش هم رفتم دستی و نوی اون رو به ReturnValue تغییر دادم .
در کل سه تا پارامتر داشتم 2تا برای درج در جدول و یکی برای خروجی @@Error . یا حالا هر چیز دیگه . دستور insert رو مستقیما توی Query نوشتم .
بعد مقادیر رو ارسال میکردم . ثبت به درستی انجام میشد . اما خطا میداد .

یا اینکه در query یک متغیر تعریف کردم و یه مقدار رو بهش Set کردم و بعدش هم رفتم یک پارامتر دقیقا با اون نام از نوع ReturnValue تعریف کردم . اما باز هم .....
یعنی هر کاری که به ذهنم رسید انجامدادم به نتیجه ای نرسید .
توی Help هم چیزی پیدا نکردم .

vcldeveloper
چهارشنبه 23 بهمن 1387, 02:06 صبح
پارامترهای خروجی وقتی که یک SP را فراخوانی می کنید، کاربرد دارند، نه وقتی یک کوئری معمولی می نویسید.

bmanfy
چهارشنبه 23 بهمن 1387, 11:38 صبح
پارامترهای خروجی وقتی که یک SP را فراخوانی می کنید، کاربرد دارند، نه وقتی یک کوئری معمولی می نویسید.

پس با یک موئری ساده نمیشه !
Sp هم حتما باید Function باشه . اره ؟ با Procedure نمیشه .

اگه بخوام بدون استفاده از sp یک مقدار خروجی داشته باشیم تکلیف چیه .
مثلا همین کاری که من میخوام انجام بدم . بدون استفاده از Sp یک مقداری رو ثبت کنم و سپس مقدار Error@@ رو برگردونم .
راهی هست ؟

accpascal
چهارشنبه 23 بهمن 1387, 19:26 عصر
اگه بخوام بدون استفاده از sp یک مقدار خروجی داشته باشیم تکلیف چیه .
مثلا همین کاری که من میخوام انجام بدم . بدون استفاده از Sp یک مقداری رو ثبت کنم و سپس مقدار Error@@ رو برگردونم .
راهی هست ؟
با دستور select می توانی خروجی داشته باشی
موفق باشید

vcldeveloper
پنج شنبه 24 بهمن 1387, 02:31 صبح
Sp هم حتما باید Function باشه . اره ؟ با Procedure نمیشه .
SP ایی که function باشه نداریم! در SQL Server مفهوم function و procedure مثل دلفی و پاسکال نیست. تمام SP ها اسمشان هست Procedure، و function ها یک سری توابع خاص هستند.

bmanfy
جمعه 25 بهمن 1387, 09:08 صبح
با دستور select می توانی خروجی داشته باشی

با تشکر .
اما چه جوری .
میخوام بعد از ثبت اطلاعات مقدار Error@@ رو برگردونم . اما میشه بگید چه طوری ؟


Select @@Error

یعنی اینجوری . اگه میشه یه توضیح کوچیک بدین . ممنون میشم .

bmanfy
جمعه 25 بهمن 1387, 09:16 صبح
SP ایی که function باشه نداریم! در SQL Server مفهوم function و procedure مثل دلفی و پاسکال نیست. تمام SP ها اسمشان هست Procedure، و function ها یک سری توابع خاص هستند.

پس اگر این طوره که شما میگید چه طور میشه از یک function در یک شی Store Procedure استفاده نمود .
هر چند میگند Sp و p اون مربوط به Procedure اما خوب در کل یک مفهوم رو داره با تمام زبانها .
function به چیزی گفته میشه که خروجی داشته باشه و Procedure خورجی نداره . که در Sql هم دقیقا همین روند در تعریف این دو وجود داره .

bmanfy
جمعه 25 بهمن 1387, 09:23 صبح
SP ایی که function باشه نداریم! در SQL Server مفهوم function و procedure مثل دلفی و پاسکال نیست. تمام SP ها اسمشان هست Procedure، و function ها یک سری توابع خاص هستند.


پس اگر این طوره که شما میگید چه طور میشه از یک function در یک شی Store Procedure استفاده نمود .
هر چند میگند Sp و p اون مربوط به Procedure اما خوب در کل یک مفهوم رو داره با تمام زبانها .
function به چیزی گفته میشه که خروجی داشته باشه و Procedure خورجی نداره . که در Sql هم دقیقا همین روند در تعریف این دو وجود داره .

bmanfy
چهارشنبه 30 بهمن 1387, 17:41 عصر
بین این همه برنامه نویس کسی اخرش یه جواب به من نداد .
کارم خفن گیره .
میخوام یک رکورد رو با استفاده از sp ثبت کنم و در انتها مقدار @@Error رو به برنامه ام برگردانم .
یکی یه راهنمایی بکنه دیگه . وجدانا هر کاری می کنم نمیتونم .

bmanfy
یک شنبه 04 اسفند 1387, 10:09 صبح
خوب با توجه به اینکه کسی در این زمینه نظری نداشت . حالا نمیدونم چرا . اما خوب خودم به یک نتیجه ای رسیدم مینویسم تا شاید اگر کسی دیگری از دوستان چنین مشکلی داشتن گیر نکنه . :
اگر دقت کنید زمانی که یک شadoStoreProcedure رو به یک Sp در sql وصل میکنیم یک پارامتر به طور خودکار با نام Return_Valu@ میسازه .
اگر در sp از دستور Return استفاده کنیم .اون مقدار به این پارامتر برمیگرده . مثلا :


Return 10


که با این روش میتونیم مقدار بازگشتی رو تعریف کنیم .

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

vcldeveloper
یک شنبه 04 اسفند 1387, 17:34 عصر
خوب با توجه به اینکه کسی در این زمینه نظری نداشت . حالا نمیدونم چرا .
علتش اینه که شما جواب های داده شده را با دقت مطالعه نمی کنید، وگرنه جواب شما در پست های قبلی داده شده بود.


اما اگه بخواهیم بیشتر از یک پارامتر خروجی داشته باشیم تکلیف چیه ؟
پارامترها می تونند از نوع In یا Out باشند. نوع پارامتر تعریف شده اگر Out باشه، میشه درش مقداری را به برنامه فراخوان SP برگرداند.

bmanfy
دوشنبه 05 اسفند 1387, 20:43 عصر
علتش اینه که شما جواب های داده شده را با دقت مطالعه نمی کنید، وگرنه جواب شما در پست های قبلی داده شده بود.

من که کامل بررسی کردم مطالب رو . جوابها یی که داده میشه همش در یک حد کلیه . والا شما هم از اول یه بررسی بکنید . اگر جوابی دیدید .


پارامترها می تونند از نوع In یا Out باشند. نوع پارامتر تعریف شده اگر Out باشه، میشه درش مقداری را به برنامه فراخوان SP برگرداند.

خوب درست تا اینجاش میدونم . اما چه طور درون Sp به اونها مقدار بدیم . من از زوشهای زیادی برای همین کار استافده کردم . مثلا با استافده از Set نشد و ...
درسته جواب داده میشه اما به همین شکلی که شما دادید . خیلی خیلی کلی که در این حد که خودم هم میدونم . نکات کلیدی اصلی گفته نمیشه .

سوء تفاهم نشه یک وقت من روی سخنم با هیچ یک از دوستان برنامه نویس این سایت نیست . نمیدونم چه طوریه که هیچ کس راه اصلی یک کار رو به کسی دیگه نمیگه . یعنی نکات ریز و اساسی و آدمهای کمی پیدا میشن که این نکات رو در اختیار دیگران میزارن . شاید یکی از دلایل عقب ماندگی ایران ما هم همین باشه .
زکات علم نشر آن است .

vcldeveloper
سه شنبه 06 اسفند 1387, 03:09 صبح
سوء تفاهم نشه یک وقت من روی سخنم با هیچ یک از دوستان برنامه نویس این سایت نیست . نمیدونم چه طوریه که هیچ کس راه اصلی یک کار رو به کسی دیگه نمیگه . یعنی نکات ریز و اساسی و آدمهای کمی پیدا میشن که این نکات رو در اختیار دیگران میزارن . شاید یکی از دلایل عقب ماندگی ایران ما هم همین باشه .
علتش چند نکته ساده هست:

1- بسیاری از کاربران انتظار دارند فرد سوال کننده چندین ساعت وقت بزاره و تمام ریز و بم یک موضوع خاص را برای آنها شسته و رفته، به شکل یک جزوه آماده کنه، و تحویل بده! فرد سوال کننده خودش باید سعی کنه از جواب دیگران نکات مورد نظر را بدست بیاره، سرنخ ها را بگیره، و با استفاده از آنها به تحقیق درباره موضوع بپردازه. من الان اگر بگم تابع X را اجرا کن. اکثر کاربران دیگه به خودشون زحمت نمیدند برن مستندات آن تابع را مطالعه کنند، یا درباره آن تابع در اینترنت جستجو کنند، حداقل بفهمند کارش چیه، بلکه یک راست میرن اون تابع رو در کدشان می نویسند، و بلافاصله میان میگن، "کار نکرد، تو رو خدا یکی کمک کنه!". این یعنی آقا من حال و حوصله ندارم درباره مشکلم تحقیق کنم، یکی مردونگی کنه بره بجای من تحقیق کنه، خلاصه تحقیق رو اینجا برای من توضیح بده!

2- مسئله دوم سوالات کلی هست. قبلا در یکی دو تاپیک دیگه هم مفصلا درباره این مشکل توضیح دادم که سوال اگر کلی باشه، جواب هم کلی هست. مثلا کاربری که میاد می پرسه بهترین روش اتصال به بانک اطلاعاتی چی هست، انتظار داره چی بهش جواب بدیم؟! تمام روش های موجود را یک به یک با مثال و ذکر معایب و مزایا و ریزه کاری توضیح بدیم؟! خب اگر یکی همچین وقتی داشته که یک موضوع کلی مثل این را در چند صد صفحه توضیح بده، می رفت آن را تبدیل به کتاب می کرد و منتشر می کرد.

3- دقت نکردن به تالاری که سوال در آن مطرح می شود. نمونه این مشکل در همین تاپیک مشخص هست. درسته اینجا بخش کار با بانک های اطلاعاتی در دلفی هست، ولی کاربر باید سعی کنه خوب سوال خودش را آنالیز کنه، و مناسب ترین تالار را برای سوالش انتخاب کنه. طبیعی هست سوال مربوط به چگونگی مقدار دادن به یک پارامتر در داخل SP، مربوط به تالار بانک های اطلاعاتی، یا بطور خاص SQL Server باشه، نه مربوط به دلفی. اینکه شما در SP چطور باید کد بنویسید به دلفی مربوط نمیشه.

4- چهارم هم درست سوال نکردن هست، که درباره این موضوع چندین بار افراد مختلف توضیح دادند. در خیلی از تاپیک ها حداقل باید 3-4 پست بین سوال کننده و پاسخ دهنده رد و بدل بشه تا تازه پاسخ دهنده متوجه بشه سوال چی هست! سوال خوب پرسیدن هم به معنی سوال طولانی پرسیدن نیست! چون درباره اش زیاد صحبت شده، دیگه بیشتر توضیح نمیدم.



اما چه طور درون Sp به اونها مقدار بدیم . من از زوشهای زیادی برای همین کار استافده کردم . مثلا با استافده از Set نشد و ...


CREATE PROCEDURE Test
@MyVariable int OUTPUT
AS
SET @MyVariable = 20


نحوه دریافت مقدار خروجی از طریق کد SQL:


DECLARE @MyVariable int
EXECUTE Test @MyVariable OUTPUT
SELECT @MyVariable

نحوه دریافت مقدار پارامتر خروجی از طریق کد دلفی:


var
MyVariableStr : string;
begin
ADOStoredProc1.Close;
ADOStoredProc1.ProcedureName := 'Test';
ADOStoredProc1.Parameters.CreateParameter('MyVaria ble',ftInteger,pdOutput,0,null);
ADOStoredProc1.ExecProc;
MyVariableStr := VarToStr(ADOStoredProc1.Parameters.FindParam('MyVa riable').Value);
ShowMessage(MyVariableStr);
end;

accpascal
سه شنبه 06 اسفند 1387, 17:14 عصر
نمیدونم چه طوریه که هیچ کس راه اصلی یک کار رو به کسی دیگه نمیگه . یعنی نکات ریز و اساسی و آدمهای کمی پیدا میشن که این نکات رو در اختیار دیگران میزارن . شاید یکی از دلایل عقب ماندگی ایران ما هم همین باشه .
زکات علم نشر آن است .
اولا اینطور نسیت که شما می فرمایید در خیلی از تایپیکها دیده شده که بطور کامل و ریز به سوالات جواب داده شده
ثانیا بعضی از دوستان توقع دارند راجع به هر سوالی تمام جزئیات آن بصورت کد در اختیارشان قرار گیرد بدون اینکه خودشان هیچ تلاشی بکنند
من فکر می کنم همان نکات کلی که شما می فرمایید دیگران می گویند خیلی مهم است و دوستانی که همان نکات کلی را مد نظر قرارداده و خودشان بدنبال جزئیات وکدهای مورد نیاز می روند خیلی اساسی تر مطلب را درک کرده و یاد می گیرند
قرار نیست در این سایت کسی برنامه نویسی یاد بگیره فکر می کنم در این سایت و یا سایتهای مشابه کمک برای برنامه نویسی بهتر است که مهم می باشد
زکات 20 در صد است نه صد در صد

bmanfy
چهارشنبه 07 اسفند 1387, 09:39 صبح
ضمن تشکر از جواب خوب و کاکلتون آقای کشاورز .


بسیاری از کاربران انتظار دارند فرد سوال کننده چندین ساعت وقت بزاره و تمام ریز ......

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

خیلی ممنون از پاسختون .

bmanfy
چهارشنبه 07 اسفند 1387, 09:58 صبح
ثانیا بعضی از دوستان توقع دارند راجع به هر سوالی تمام جزئیات آن بصورت کد در اختیارشان قرار گیرد بدون اینکه خودشان هیچ تلاشی بکنند

من ابدا چنین انتظاری ندارم . در پست قبلی هم توضیح دادم .
من همیشه در راس سعی میکنم از Help استفاده کنم . BookOnline هم رو سیستم من نصب نمیشد و خطا میداد و ..... من تا جایی که بتونم خودم سعی میکنم .
دوست عزیز بعضی جزئیات خیلی مهمتر از کلیات است . کلیات رو راحت میشه گیر آورد اما جرئیات کیمیاست .
مثلا اینجا رو ببین :


@MyVariable int OUTPUT

تمام مشکل من سر همین کلمه ی OutPut بود . نمیدونستم کجاباید تعریفش کنم . چندین بار همین کار رو کردم اما در ابتدا تعریف می کردم و .......
من چندین بار پرسیدم چطور میشه outPut تعریف کرد . تا چنتا پست پیش کسی نگفت باید در سمت Sql هم از کلمه ی OutPut استفاده کنی . اکثرا میگن :


به راحتی میتونید شما از نوع OutPut تعریف کنید

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


قرار نیست در این سایت کسی برنامه نویسی یاد بگیره فکر می کنم در این سایت و یا سایتهای مشابه کمک برای برنامه نویسی بهتر است که مهم می باشد

اگر قرار نیست برنامه نویسی یاد بگیریم باید چی یادبگیریم . به قول شما حتما کمک . تا کسی مشکلی نداشته باشه که نمیاد کمک بخواد . و قتی کمک می خواد بهش جواب داده میشه . پس چیزی یاد میگیره .
پس همه برای یادگیری اینجاییم . حالا یه عده سوالاتشون بیشتره و عده ای هم اصلا سوال ندارند .


زکات 20 در صد است نه صد در صد

من هم نگفتم بیشتره . گفتم زکات علم نشر آن است . در ضمن برای پرداخت زکات یه چیزهایی مشخص شده و هر چیزی نمیتونی بدی . مثلا نمی تونی لباسهای کهنه رو برای زکات بدی .
به نظر من زکات علم نکات کلیدی علم است درواقع همون 20درصد که شما میگی .