PDA

بازدید نسخه کامل شده : ؟؟؟ اجراي توابع SQL در سورس برنامه ؟!!


Mojgan110
07-28-2006, 09:54 PM
:shameb:
يك تابع در SQL Server نوشتم به اين صورت :

CREATE FUNCTION TellMePos(@tbID int = 0)
RETURNS int
AS
BEGIN
DECLARE @RowPos int

SET @RowPos = (SELECT rowpos FROM tbPosition
WHERE ( tbID = @tbID))

RETURN @RowPos
END



كه كار ساده اي هم انجام ميده :: مقدار فلان ستون را با توجه به پارامتري كه بهش ارسال ميشه ، برميگردونه . همين !

اصلا به اين دليل تابع نوشتم كه فكر كردم ميشه مثل توابعي كه در برنامه نويسي مينويسيم ، در برنامه توسط مثلا ADOQuery اجرايش كرد و مقدارش را فراخواني كرد .

ولي اينطور نشد ! مجبور شدم كه اينطوري اجراش كنم :

SELECT dbo.TellMePos(1) as Jaa

خب حالا به مقداري كه اين تابع برميگرداند ، در برنامه احتياج دارم . و مجبور هستم كه مثلا يك Label قرار بدهم و بايندش كنم و اينا :eyes_droped:

ولي من ميخوام يك جوري بشه كه بتوان از توابع Sql ي هم مثل توابع معمولي فراخواني كنيم و استفاده كنيم .

چنين راهي هست ... كه مثلا اينجوري بشه نوشت :
myValue := ADOQuery.Open


ضمنا شما خودتان پيشنهادتان چي هست ؟

balabala
07-28-2006, 09:59 PM
باید از پارامترها استفاده کنید. توی سی شارپ از SqlParammeter میتونی استفاده کنی تا خیلی ساده مقدار اولیه رو بدی و از کانکشت مقدار برگشتی رو بخواید. فکر کنم تو یکی دیگه از تاپیکها یه مثال آورده بودم.
استفاده از procedure که می خواید استفاده کنید یکی از بهترین راه هاست.
یا شایدم من منظورت رو درست متوجه نشدم :grimace:

balabala
07-28-2006, 10:02 PM
باید از پارامترها استفاده کنید. توی سی شارپ از SqlParammeter میتونی استفاده کنی تا خیلی ساده مقدار اولیه رو بدی و از کانکشت مقدار برگشتی رو بخواید. فکر کنم تو یکی دیگه از تاپیکها یه مثال آورده بودم.
استفاده از procedure که می خواید استفاده کنید یکی از بهترین راه هاست.
یا شایدم من منظورت رو درست متوجه نشدم :grimace:
http://my.blackmice.com/showpost.php?p=228985&postcount=7

balabala
07-28-2006, 10:49 PM
این آرتیکل هم خوب توضیح داده چشکلی یه UDF بسازیم و استفاده کنیم:
http://www.devarticles.com/c/a/SQL-Server/Creating-User-Defined-Functions-In-SQL-Server-2000/

(6 صفحه ست)

اینم یه آموزش دیگه همراه با مثال سی شارپش:
http://www.sqlmag.com/Article/ArticleID/48380/sql_server_48380.html

http://www.winnetmag.com/Files/09/48380/48380.zip

Mojgan110
07-29-2006, 12:04 AM
اوه ! حالا كه يك مشكل جديد ::

خب Query اينه ديگه :

SELECT dbo.TellMePos(1) as Jaa

كه اون عدد 1 ، پارامترمان هست كه ارسال ميشه . يعني كه پارامتر اينبار جزيي از خود دستور SQL نيستش ، مربوط به تابعي هست كه داخل اون دستور استفاده شده !

حالا از داخل برنامه ،‌چجوري مقدار دهي اش كنيم ؟

balabala
07-29-2006, 01:40 PM
اوه ! حالا كه يك مشكل جديد ::

خب Query اينه ديگه :

SELECT dbo.TellMePos(1) as Jaa

كه اون عدد 1 ، پارامترمان هست كه ارسال ميشه . يعني كه پارامتر اينبار جزيي از خود دستور SQL نيستش ، مربوط به تابعي هست كه داخل اون دستور استفاده شده !

حالا از داخل برنامه ،‌چجوري مقدار دهي اش كنيم ؟ توی مثال ها ( http://www.devarticles.com/c/a/SQL-Server/Creating-User-Defined-Functions-In-SQL-Server-2000/ ) رو اگر نگاه کنی، پیشنهاد کرده که به این صورت کوئری بگیریم:

SELECT * FROM dbo.TellMePos(1)
درضمن همونطوری که توی procedure ها پارامتر میدادیم ( http://my.blackmice.com/showpost.php?p=228985&postcount=7 ) و با مقادیر پرش میکردیم، اینجا هم بجای 1 یه پارامتر میگذاری و بهش مقدار میدی. مثلا اسمش رو میذارید input@
بعد یه پارامتر add میکنید از نوع input و بهش مقدار 1 میدید. برگشتش هم که شبیه یه کوئری معمولیه. میشه با DataRead هم مقدارش رو گرفتم (سی شارپ)
درواقع فکر نمیکنم لازم باشه شبیه کوئری بفرستی. فقط گذاشتن اسم فانکشن توی SqlCommand باید کافی باشه...مثل مثال پروسیجر توی اونیکی تاپیک... تابع و پروسیجر فرق زیادی ندارن همونطور که یه تابع و پروسیجر توی یه زبان فرق زیادی ندارن.... تابع یه مقدار برگشتی داره ولی پروسیجر نداره.