View Full Version : سوال: چگونه در دلفي از Store procedure استفاده كنم ؟
mjnikbn
چهارشنبه 02 اردیبهشت 1388, 18:56 عصر
من هر چي توي اين تاپيك ها گشتم :افسرده: چيزي كه بصورت جامع در مورد نحوه استفاده از Store procedure در دلفي گفته باشه بدست نياوردم يكي لطفاً آموزش بده هم معرفي و نحوه ارسال پارامتر و ... !
Developer Programmer
پنج شنبه 03 اردیبهشت 1388, 09:58 صبح
روشهای مختلفی واسه استفاده از Strored Procedure ها هست.برای اینکار میتونی از ADOCommand یا AdoDataSet یا AdoStoredProcedure استفاده کنی.
مثلا
with ADODataSet1 do
begin
Connection:=ADOConnection1;
CommandText:='sp_testProc';
CommandType:= cmdStoredProc;
end;
with ADOCommand1 do
begin
Connection:=ADOConnection1;
CommandText:'sp_testProc';
Execute;
end;
with ADOStoredProc1 do
begin
Connection:= ADOConnection1;
ProcedureName:= 'sp_TestProc';
ExecProc;
حالا فرض کن که میخوای یه پارامتر هم بهش پاس بدی یا ازش مقدار بازگشتی رو دریافت کنی، واسه اینکار از پراپرتی Parameters استفاده میکنن
مثلا
with ADOCommand1.Parameters do
begin
ParamByName('last_Name').DataType:=ftString;
ParamByName('last_Name').Value:= edit1.text;
ParamByName('last_Name').Direction:= pdInput;
end;
حالا اگه پارامتر رو pdOutput کنی، مقدار برگشتی رو میتونی بخونی.
MyStoredProcedure.ExecProc; { does not return a result set }
Edit1.Text := MyStoredProcedure.ParamByName('OUTVAR').value;
اما اگه چیزی شبیه به این نوشتی
create procedure sp_test
as
begin
select * from tblTest
end;
و قراره یه رکوردست برگشت داده بشه... در اونصورت میتونی از این روش استفاده کنی
ADODataSet1.Recordset := ADOCommand1.Execute;
mjnikbn
پنج شنبه 03 اردیبهشت 1388, 16:17 عصر
لطف كنيد و يك Store procedure بنويسيد و آن را فراخواني كنيد؟ :گریه:
Developer Programmer
پنج شنبه 03 اردیبهشت 1388, 18:32 عصر
فرض کن این Stored Procedure رو در NorthWind ایجاد کردیم.
CREATE PROCEDURE CustOrderHist @CustomerID nchar(5)
AS
SELECT ProductName, Total=SUM(Quantity)
FROM Products P, [Order Details] OD, Orders O, Customers C
WHERE C.CustomerID = @CustomerID
AND C.CustomerID = O.CustomerID AND O.OrderID = OD.OrderID AND OD.ProductID = P.ProductID
GROUP BY ProductName
یه پارامتر ورودی داره به نام CustomerID که بر اساس مقدار اون Join زده شده و رکوردها رو برمیگردونه.
یعنی کوئری باید شبیه به این باشه :
DECLARE @CustomerID nchar(5)
Set @customerID = 'ALFKI'
EXECUTE CustOrderHist @CustomerID
GO
پس یه پروژه جدید در دلفی ایجاد کن
1) ابتدا این یونیت ها رو به Uses اضافه کن
adoDB,dbGrids,dbCtrls, DB;
2) این متغیرها رو در Private یا Public تعریف کن
AdoConnection: TADOConnection;
AdoDataSet: TADODataSet;
AdoDataSource : TDataSource;
dbGrid : TDBGrid;
dbNabigator: TDBNavigator;
3) در یه Event ای مثل Form_Create این کد رو بنویس
AdoConnection:= TADOConnection.Create(nil);
with AdoConnection do
begin
Connected:=False;
ConnectionString:='Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Northwind;Data Source=.';
LoginPrompt:=False;
end;
AdoDataSet:=TADODataSet.Create(nil);
With AdoDataSet do
begin
Active:=False;
Connection:= AdoConnection;
CommandType:=cmdStoredProc;
CommandText:='CustOrderHist';
Parameters.Clear;
Parameters.CreateParameter('@CustomerID',ftWideStr ing,pdInput,7,'ALFKI');
end;
AdoDataSource:= TDataSource.Create(nil);
With AdoDataSource do
begin
DataSet:= AdoDataSet;
AutoEdit:=False;
end;
dbGrid:= TdbGrid.Create(nil);
With dbGrid do
begin
ReadOnly:=true;
DataSource:=AdoDataSource;
Parent:= Self;
width:=350;
end;
dbNabigator := TDBNavigator.Create(nil);
With dbNabigator do
begin
DataSource:=AdoDataSource;
Parent:= Self;
top:=150;
width:=350;
end;
AdoConnection.Connected:=True;
AdoDataSet.Active:=True;
with self do
begin
AutoSize:=True;
Caption:='Stored Procedure CustOrderHist on Northwind';
end;
4) در Event ای مثل Form_Close هم این کد رو بنویس
if Assigned(AdoConnection) then
AdoConnection.Connected:=False;
5) برنامه رو Run کن.
- توجه کن که من کل کار با DB رو با کد نویسی انجام دادم واسه همین مجبورم که CreateParam کنم و پارامترها رو بهش معرفی کنم. اما اگه در حالت Design mode بودم، نیازی به اینکار نبود چون بلافاصله بعد از معرفی Stored Procedure، دلفی پارامترها رو می سازه و منتظر مقدار دهیشون میشه.
- نوع پارامتر رو pdInput نوشتم علتش اینه که قراره یه مقدار رو من به SQL Server پاس بدم، حالا اگه قرار بود SQL مقداری رو از طریق این پارامتر پاس میداد اون رو از نوع pdOutPut معرفی میکردم و اگه Stored Procedure رو طوری مینوشتم که از طریاق این پارامتر هم مقداری رو پاس میدادم و هم مقداری رو میخوندم، باید اونرو pdInputOutput تعریف کنم.اما اگه در انتها، Stored Procedure با استفاده از Return مقداری رو بازگشت میداد(نه از طریق پارامترها) اون وقت باید اونرو pdReturnValue تعریف میکردم.
- من از DataSet به جای AdoQuery استفاده کردم و کاملا سلیقه ایه.
- در دات نت، من مستقیما کوئری رو اجرا میکنم؛ و احتمال دادم در دلفی هم بشه اینکار رو کرد . منتها دلفی، به اسکالر بودنش گیر داد و متوجه نشدم اشکال از کجاست.
CommandText:='EXECUTE CustOrderHist @CustomerID';
CommandType:= cmdText;
Parameters.CreateParameter('@CustomerID',ftWideStr ing,pdInput,7,'ALFKI')
end;
- در خاتمه، این نکته رو هم بگم که ( وقتی با دستورات sql کار میکنیم) دو نوع پارامتر در دلفی تعریف میکنیم. یکی از این پارامترها مثل همینCustomerID@ با @ شروع میشه و به درد Stored Procedure ها میخوره یکیشون هم با : شروع میشه و در جاهایی مثل Where به درد میخوره
CommandText:='select * from customers where CustomerID= :CustomerID'
استفاده از پارامترها باعث میشه، خوندن و نوشتن کوئری ها خیلی راحتتر بشه.
سئوال دیگه ای داشتی، بپرس
mjnikbn
پنج شنبه 03 اردیبهشت 1388, 20:25 عصر
از راهنمايي و توضيح مفصلتان ممنون. :تشویق:
دارم سعي مي كنم پرسيجر نوشتن را ياد بگيرم تا از راهنمايي هاتون استفاده كنم. :عصبانی:
delphiprog3000
شنبه 05 اردیبهشت 1388, 11:26 صبح
با سلام.
در ادامه صحبت دوستمان این لینکها نیز میتونه شما رو به پاسخ نزدیکتر کنه
http://barnamenevis.org/forum/showthread.php?t=104378
http://barnamenevis.org/forum/showthread.php?t=112991
http://barnamenevis.org/forum/showthread.php?t=120682
http://barnamenevis.org/forum/showthread.php?t=105786
http://barnamenevis.org/forum/showthread.php?t=101475
http://barnamenevis.org/forum/showthread.php?t=84612
موفق باشید.............
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.