PDA

View Full Version : اجرای دو دستور در یک کوئری



sara_aryanfar
پنج شنبه 27 بهمن 1390, 16:29 عصر
با سلام خدمت دوستان من در یک صفحه که برای نمایش پست در نظر گرفتم اطلاعات یک جدول رو واکشی می کنم و نمایش میدم حالا می خوام در همون صفحه همزمانی که اطلاعات رو واکشی می کنم یکی از فیلد ها رو به روزرسانی کنم یعنی فیلدی که نشانگر تعداد بازدید پست هست رو یک واحد اضافه کنم چطوری میشه هم دستور سلکت و آپدیت رو در یک کوئری انجام داد

A.S.Roma
جمعه 28 بهمن 1390, 00:01 صبح
راه های زیادی هست !

ساده ترینش اینه که مثل بقیه دستورات باهاش رفتار کنی. پشت سر هم تو یه string بنویس !
می تونی داخلی یک Store Procedure بنویسی.

می تونی 2 تا sqlCommand بنویسی .

Rohollaes
جمعه 28 بهمن 1390, 00:42 صبح
هم میتونی 2تا دستور رو داخل یه sp بنویسی و اون sp رو اجرا کنی و
از triger ها هم میتونی استفاده کنی

sara_aryanfar
جمعه 28 بهمن 1390, 04:06 صبح
راستی سوالی که برا من در مورد sp هست اینه که برای هر جدول یک sp میشه نوشت یا می توان از یک sp برای چندین جدول استفاده کرد؟

A.S.Roma
جمعه 28 بهمن 1390, 12:37 عصر
sp‌ربطی به Table‌نداره !

fakhravari
جمعه 28 بهمن 1390, 13:07 عصر
sp یه query

sara_aryanfar
جمعه 28 بهمن 1390, 15:07 عصر
خب یه کوئری هست یعنی برای هر جدولی خواستیم می تونیم ازش استفاده کنیم مگه تو دستور سلک یا دیلیت یا هرکدوم نام جدول رو ما درج نمی کنیم

A.S.Roma
شنبه 29 بهمن 1390, 00:14 صبح
هنوز متوجه سوال شما نشدم.
شما می تونید تو SP هر قدر که می خواهید کد بنویسید (مثلا" 1000 خط ! )
از هر Table یا هر Object دیگه تو SQL استفاده کنید .
هیچ محدودیتی هم نداره !

sara_aryanfar
شنبه 29 بهمن 1390, 11:37 صبح
میشه یک مثال ساده بزارید که در اون با استفاده از sp روی دوتا جدول دستور select و update رو اجرا کرده ممنون میشم

A.S.Roma
شنبه 29 بهمن 1390, 11:50 صبح
CREATE PROCEDURE Test
@ID INT,
@Title NVARCHAR(512)
AS
BEGIN
UPDATE tblName SET Title = @Title WHERE ID = @ID
SELECT * FROM tblName2
END

sara_aryanfar
شنبه 29 بهمن 1390, 13:20 عصر
ممنون اینجای بحث رو متوجه شدم فقط در بحث دستورات اتصال مربوط به این sp برام مبهم هست یکی از دوستان چند روز پیش فرمودند فرقی نداره و دو بار عمل اتصال انجام میشه اگه ممکنه کدهایی که در قسمت کد سمت سرور صفحه برای استفاده از این sp رو می بنویسید رو هم بزارید ممنون

mehdi3000
شنبه 29 بهمن 1390, 14:46 عصر
محيط داخلي يك استار پراسيجر را مانند محيط داخلي يك فانكشن در نظر بگيريد. با امكان تعريف پارامترهاي ورودي, تعريف متغيرهاي داخلي, انجام عملياتهاي هدفمند, و return مقدار خروجي.

sara_aryanfar
شنبه 29 بهمن 1390, 15:30 عصر
پس ما می تونیم نام جدول و هر پارامتر دیگری مثل id را بهش ارسال کنیم درسته؟

mehdi3000
شنبه 29 بهمن 1390, 15:42 عصر
نام تيبل را تا حالا امتحان نكردم
ولي در كل بهتون توصيه مي كنم دستور نوشتن استار پراسيجر را در وب سرچ كرده و مطالعه كنيد.

اگه كار كردن با آن راياد بگيريد خواهيد ديد تا چه اندازه كار راه اندازه.

mehdi3000
شنبه 29 بهمن 1390, 15:46 عصر
نام تيبل را تا حالا امتحان نكردم
ولي در كل بهتون توصيه مي كنم دستور نوشتن استار پراسيجر را در وب سرچ كرده و مطالعه كنيد.

اگه كار كردن با آن راياد بگيريد خواهيد ديد تا چه اندازه كار راه اندازه.

sara_aryanfar
شنبه 29 بهمن 1390, 15:52 عصر
مشکل من در قسمت کد بهینید هست یعنی ما وقتی یک sp رو استفاده می کنیم چطوری ازش می خوایم دوتا دستور داخلش رو پشت سر هم اجرا کنه مثلا فرض کن من می خوام اول یه جدول رو بخونم و مقادیرش رو داخل چند تا لیبل بزارم و بعد یک فیلدش رو به روز کنم کدش چطوری هست ؟

mehdi3000
یک شنبه 30 بهمن 1390, 01:04 صبح
با سلام مجدد

همانطور که قبلا به آن اشاره شد؛ ساختار یک استار پراسیجر همانند ساختار یک متد یا یک فانکشن می باشد؛ با این تفاوت که کلیه عملیات مورد اجرا در یک بار فراخوانی دیتابیس و در سطح دیتابیس انجام می پذیرد به جای اینکه در چندین نوبت مقادیری را بین دیتابیس و برنامه رد و بدل کنیم که این خود موجب بهینه شدن کدهای نوشته شده می باشد.

مثالی رو که شما مطرح می کنید تقریبا می شه گفت برای یک استار پراسیجر و یا حتی یک تک متد در قسمت کد بهینید غیر ممکنه؛ و حداقل نیازمند دو استار پراسیجر و یا دو متد می باشد
اولی برای خواندن مقادیر یک جدول.
دومی برای به روز رسانی یکی از فیلدها

mehdi3000
یک شنبه 30 بهمن 1390, 01:07 صبح
حال اگر مراحل کار بلعکس بود یعنی در ابتدا می خواستیم مقدار فیلدی را از یک جدول به روز رسانی کرده و سپس محتوای جدول را با مقادیر به روز شده نمایش دهیم این کار را می شد در یک استار پراسیجر انجام داد همانطوری که در یک تک متد در سطح کد بهینید می توان برای آن کدنویسی کرد

sara_aryanfar
یک شنبه 30 بهمن 1390, 01:33 صبح
برای هر جدول یک sp نیاز هست فکر می کنم اگر نشه نام جدول رو فرستاد

mehdi3000
یک شنبه 30 بهمن 1390, 01:40 صبح
ببینید همونطوری که شما در نوشتن یک متد نیاز ندارید که حتما تمامی اطلاعات مورد نیاز رو به صورت پارامتر ورودی به متد ارسال کنید و می توانید درون سطح داخلی یک متد اطلاعاتی رو تعریف کنید و یا متغیرهایی بامقادیر دلخواه ایجاد کنید در اینجا نیز در سطح یک استار پراسیجر شما می توانید مشخصات یک تیبل را درون سطح یک استار پراسیجر صدا زده و استفاده نمایید

باز هم به شما توصیه می کنم مطالعه ای هر چند اجمالی پیرامون استارپراسیجرها انجام دهید

مطمئن هستم که برایتان بسیار سودمند واقع خواهد شد و از آن بارها استفاده خواهید کرد

sara_aryanfar
یک شنبه 30 بهمن 1390, 02:07 صبح
به طور حتم چنین مطالعه ای سودمنده و انجام میشه اما الان من تو این بخش موندم که الان فرض کنید ما داخل sp دوتا دستور select وupdate تعریف کردیم حالا با چه کدی باید بگیم اینا پشت سرهم اجرا بشن توجه داشته باشین id رو داریم

sara_aryanfar
یک شنبه 30 بهمن 1390, 02:33 صبح
این کد چرا الان کار نمی کنه

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
int id = Convert.ToInt32(e.CommandArgument.ToString());
if (e.CommandName.Equals("dett"))
{
string sp = "tname";
SqlConnection conobj = new SqlConnection(ConfigurationManager.ConnectionStrin gs["ConnectionString"].ConnectionString);
conobj.Open();
SqlCommand comobj = new SqlCommand(sp, conobj);
comobj.CommandType = CommandType.StoredProcedure;
comobj.Parameters.AddWithValue("@id",id);

comobj.ExecuteReader();
conobj.Close();
GridView1.DataBind();

}
}
اینم sp

ALTER PROCEDURE tname
@ID INT

AS
BEGIN
UPDATE tbtest SET hit = hit+1 WHERE ID = @ID
SELECT * FROM tbtest
END

behrad110
یک شنبه 30 بهمن 1390, 15:10 عصر
ALTER PROCEDURE برای تغییر پروسیجری هست که قبلا ساخته شده نه برای ایجاد پروسیجر. برای ایجاد پروسیجر باید از create procedure استفاده کنید

create procedure tname @id int
as
UPDATE tbtest SET hit = hit+1 WHERE ID = @ID
SELECT * FROM tbtest

mehdi3000
یک شنبه 30 بهمن 1390, 22:54 عصر
سلام دوست عزیز
با مشاهده کد مربوط به استارپراسیجر شما می باید بگویم که کد مربوط به استار پراسیجر شما صحیح است و کاش شما متن خطای نمایش داده شده را نیز چاپ می کردید

پیرامون نوشتن استارپراسیجر دو نکته مهم وجود دارد که در زیر ذکر می کنم:
- با نوشتن دستورات مربوط به یک استار پراسیجر، تا زمانیکه متن مربوط به استارپراسیجر شما صحیح نباشد یعنی استارپراسیجر نوشته شده توسط شما دارای خطا باشد شما به هیچ عنوان امکان ذخیره آن را نخواهید داشت و هرگاه که برای save آن اقدام می کنید به شما پیغام خطا نمایش داده خواهد شد
- پیرامون متنی که دوستمان behrad110 در پست قبل نوشته اند میباید این نکته را خاطرنشان کنم که مطمئنا شما هنگام نوشتن متن مربوط به یک استار پراسیجر جدید از create procedure استفاده کرده اید به دو علت که در زیر ذکر می کنم
1- همانطور که پیشتر گفتم تا شما عبارات مربوط به یک استارپراسیجر را به درستی وارد نکنید (یعنی تا زمانیکه استارپراسیجر شما دارای هرنوع خطایی باشد) شما امکان ذخیره آن را نخواهید داشت؛ پس مطمئنا شما استارپراسیجر خود را به درستی نوشته اید که توانستید آن را ذخیره نمایید.
2- شما هنگام نوشتن یک استارپراسیجر جدید از عبارت create procedure استفاده می کنید ولی با ذخیره آن، بلافاصله عبارت create procedure به عبارت ALTER PROCEDURE تغییر خواهد یافت و شما با مشاهده مجدد آن استار پراسیجر نوشته شده از قبل به جای create procedure عبارت ALTER PROCEDURE را مشاهده کرده و از آن کپی کرده اید