جلسه هفدهم

Database 02


تمرین 1- انجام یک مثال از ExecuteScalar - حتمن در قالب یک SP باشد.

تمرین 2 - انجام یک پروژه که شامل 5 SP اصلی باشد.

1- Select All

2- Select Row

3- Insert

4- Update

5- Delete


پیشنهاد : مبحث SP ها را از یک کتاب SQL Server مطالعه کنید!


توصیه : حتمن تمرین ها را انجام دهید تا در جلسه بعد درک بهتری از مطالب داشته باشید! 

نظرات 6 + ارسال نظر
یلدا چهارشنبه 14 تیر 1391 ساعت 01:59 ق.ظ

با سلام

تمرین دوم:

برای اینکه متن را بصورت بهم ریخته نبینید می توانید آن را در یک فایل wordکپی کنید.



در مورد select All در جلسه شانزدهم توضیح داده شده ومثال هم آورده شده پس از توضیح این مورد صرف نظر می کنیم، اما در مورد بقیه موارد اولین نکته این است که این spها برای انجام کارشان نیازمند اطلاعات خاصی هستند که این کار را می توان با ارسال پارامتر به پروسیجر انجام داد، مثلاً برای دستور Delete باید id فرد مورد نظر به پروسیجر فرستاده شود .
برای تعریف پارامتر ابتدا پیشوند @ سپس هر نام دلخواه قرار می گیرد و پس از آن باید نوع داده ای آن را بنویسید و هر جا لازم شد طول داده را به آن اضافه کنید.
مثال:
@id int
اگر تعداد پارامتر ها بیشتر باشد با کاما از یکدیگر جدا می شوند
@id int,@Name nvarchar(20)
همچنین می توانید برای زمانی که کاربر هیچ مقداری را ارسال نمی کند مقدار پیش فرضی را قرار دهید فقط این نکته مهم راباید به یاد داشته باشید که این مقدار مشخص شده باید مقدار ثابتی باشد
مثال:
@Name nvarchar(20)=’NULL’
حال اگر بخواهیم ساختار کلی spها را توضیح دهیم ابتدا Create procedure را نوشته و بعد در مقابل آن نامی برایش انتخاب می کنیم در خط بعد پارا متر هایی را که لازم داریم تعیین می کنیم سپس کلمه کلیدی AS وبعد Begin که درون آن دستور مورد نظرمان را می نویسیم ودر آخر End.
مثال:
من از همان دیتاببیس Alaki که همه میشناسید استفاده کرد ه ام و همه spها را برای جدول Users نوشته ام
Spبرای دستور selectRow----------------------------------
create procedure sp_Users_selectRow

@ID int
AS
BEGIN
select* from Users where ID=@ID
end



Spبرای دستور insert--------------------------------------
CREATE PROCEDURE sp_Users_insert
@Name nvarchar(20), @Age int, @RoleID int
AS
BEGIN

insert into Users(Name,Age,RolesID)
VALUES(@Name,@Age,@RoleID)
END
Spبرای دستور Update-------------------------------------
reate procedure sp_Usres_Update
@ID int,@name nvarchar(20),@age int
AS
begin
update Users set Name = @name , Age =@age where ID = @ID
end
Spبرای دستور Delete------------------------------------
create procedure sp_User_Delete
@ID int
AS
begin
delete from Users where ID=@ID
end
اگر به کدها دقت کنید می بینید که نسبت بزرگی و کوچکی حروف حساس نیست به جز نام جدول و ستون های آن که باید دقیقاً همان نامهایی باشد که در دیتابیس تعیین کرده اید.
**************************************************
بعد از ذخیره پروسیجر های بالا برای اجرای هریک از پروسیجرهای ذخیره شده باید نام آن را مشخص کرده وپارامتر ها را به آن ارسال کنیم مانند:
sp_User_Delete 3
یا
sp_User_Delete @ID
برای همه spهای بالا دستور فراخوانی به ترتیب زیر است:
sp_Users_selectRow @ID
sp_Users_insert @name , @age , @roleid
sp_Usres_Update @id,@name , @age
sp_User_Delete @id
البته در این روش ارسال پارامتر باید ترتیب پارامتر ها رعایت شود(که ان شاء الله شخص دیگری پیدا می شود که توضیح بدهد)
من به علت کمبود وقت برای اجرای آن از همان پروژه جلسه هفدهم استفاده کردم که فقط دستورات بالا را در قسمت stringی که به solcommand می فرستیم قرار دادم که همگی اجرا شدند و هیچ مشکلی نبود.







یلدا بسیـــــــــــــــــــــار عــــــــالــــــــ ی بود

علی چهارشنبه 14 تیر 1391 ساعت 12:55 ب.ظ

با سلام و احترام
اگر یه پروژه را بشه با یه جدول تو دیتابیس انجامش داد ایرادی داره؟
در واقع در این روش داده ها بصورت خام- تفیک نشده و غیرقابل فهم به جدول میره و در هنگام استفاده بوسیله کدهای سی شارپ تحلیل شه.

مثلا برای پروژه خودم عرض میکنم. فرض کنید کل داده ها در یک عدد به ظاهر نامفهوم در پایگاه ذخیره شه. مثلا تیم دوم و سوم گروه یک با هم بازی کنند و نتیجه بازی ۴ بر صفر بنفه تیم ۳ بشه. این اتفاق رو میشه با این عدد ثبت کرد ۱۲۳۰۴
و بعدا در هنگام گزارش گیری توسط سی شارپ و شخص برنامه نویس که از راز و رمز اعداد با خبره این کدها تحلیل شه و نتایج گزارش درخاستی به کاربر ارائه بشه
بنظر من گاهی استفاده از این روش هم خوبه. البته ممکنه برای پروژه هائی که هدفش امتحان میزان تسلط شخص بر پایگاه داده باشه نشه از این روش استفاده کرد ولی کلا فکر کنم در پروژه های واقعی قابل استفاده باشه

ضمنا سایت جدیدتون مبارک باشه. نویسنده خاستید در خدمتیم

سلام
ما تو طراحی دیتابیس مبحث Denormalization داریم که همه ی اطلاعات در یک جدول ذخیره شوند که هدف اصلی آن سرعت بیشتر در گرفتن گزارشات می باشد. چرا ؟؟
این روشی که گفتی خیلی تحلیل میخواد برای مثال تیم شماره 12 با تیم شماره 3 !! چطوری متوجه میشی که 12 کد یک تیم است یا کد 2 تیم 1 و 2 و ...
درضمن این همه رمز گشایی واسه C Sharp ممکنه سرعت رو پایین بیاره .
اما در کل میشه از این ایده ها استفاده کرد اما نه برای کل پروژه واسه یه بخشی از کار ممکنه کاربرد داشته باشه

مرسی

محبوب پنج‌شنبه 15 تیر 1391 ساعت 08:15 ب.ظ

باسلام
جواب تمرین اول :
در Query زیر از SP و تابعMIN استفاده شده. می خواهیم کمترین سن user ها را از جدول users به دست بیاوریم و با executescalar داخل کدهای برنامه این Query را اجرا کنیم. در این کدها از TryParse استفاده شده که توضیح مختص آن بعد از کدها و Query داده شده است.
Query:
use Alaki;
go
create proc sp_users_MIN
as
BEGIN
select MIN(Age) from dbo.users;
END

Codes :
SqlConnection con = new SqlConnection("data source = . ; initial catalog = Alaki ; integrated security = true");
try
{
con.Open();
string query = "sp_MIN_usres";
SqlCommand cmd = new SqlCommand(query, con);
cmd.CommandType = CommandType.StoredProcedure;
object result = cmd.ExecuteScalar();
int minimum = int.TryParse(result.ToString(), out minimum) ? minimum : 0;
MessageBox.Show("The minimum age of usres is :" + minimum);

}
catch (Exception er)
{

MessageBox.Show("error:" + er);
}
finally
{
con.Close();
}


Tryparse:
وقتی از int.parse استفاده میکنیم، اگر نتواند مقداری را برگرداند یا دو Type مبدا و مقصد قابل تبدیل به یکدیگر نباشند، parse یک exeption برمی گرداند. و باید از parse زمانی استفاده کرد که مطمئن هستیم که مقدار، valid(معتبر) خواهد بود در غیر این صورت از Tryparse استفاده می شود. Tryparse در صورتی که نتواند دو type را به یکدیگر تبدیل کند یا مقدار معتبر نباشد ، به جای exception مقدار false برمی گرداند. Tryparse یک status code برمی گرداند برای نشان دادن اینکه آیا parseموفق شده یا نه؟. بهترین overload این متد : یک string میگیرد و یک مقدار خروجی (out).کاربرد این متد بیشتر برای nullable type هاست که اگر مثلاً با null مواجه شد یا در Conversion، fail شد مقدار پیش فرضی که ما تعریف کرده ایم را نمایش دهد. با خود parse هم میشود با این موارد برخورد کرد اما باید داخل catch و exception اعمال شوند که به عقیده برخی برنامه نویسان، چون catch کردن exception سربار دارد بهتر و آسان تر است از Tryparse استفاده کنیم. در مثال فوق در صورتی که نتیجه query کمترین مقدار را برگرداند که موفق به تبدیل نوع به int شده است و برنامه به اجرای خود ادامه می دهد اما اگر مقادیر age داخل DB ، null باشند(و فیلد age، allow null) Tryparse مقدار پیش فرضی که ما تعریف کردیم( یعنی 0) را برمی گرداند.
حتماً تو word کپی کنید وگرنه فکرنکنم کسی چیزی متوجه بشه چون خیلی بهم ریخته است.
البته تمامی موارد فوق استنباط من بوده و نمیدونم کامل و درست هست یا نه.

محبوب واقعا عـــــــــــــــــــــا لـــــــــــــــــــــــ ی بود
مخصوصن TryParse خیلی خوب بود

علی جمعه 16 تیر 1391 ساعت 10:54 ب.ظ

سلام
مرسی بابت پاسختون
اگر از نظر شما مشکلی نداشته باشه من فکر میکنم خیلی راحت بتونم این اعداد رو تجریه تحیلیل کنم. البته در مورد سرعتش نمیدونم چقد تاثیر بذاره. ولی میدونم در مورد دیتابیس کار خیلی راحت میشه و خیلی سریع میتونه اطلاعات لازم رو از دیتابیس بگیره و لازم نیس خیلی هم تحلیلش کنه.
جناب صدر کلاس داره تموم میشه و ما واقعا نیاز داریم با شما در اراتباط باشیم. لطفا یه کانکشن برای ارتباط بچه ها به خودتون هم تعریف کنید. البته لطفا از try , catch , close توش استفاده نکنید

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

علی شنبه 17 تیر 1391 ساعت 01:10 ق.ظ

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

علی شنبه 17 تیر 1391 ساعت 01:25 ق.ظ

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

برای نمایش آواتار خود در این وبلاگ در سایت Gravatar.com ثبت نام کنید. (راهنما)
ایمیل شما بعد از ثبت نمایش داده نخواهد شد