View Full Version : کار با دیتابیس
AmirAlimadadi
یک شنبه 02 تیر 1387, 12:25 عصر
سلام دوستان
من این تاپیک رو توی تالار دیتابیس گذاشتم ولی متاسفانه کسی به اون جواب نداد، امیدوارم که اینجا جواب بگیرم، در ضمن طرز فرستادن پارامترها و اجرای اون توی #C رو هم اگه ممکنه بگین.ممنون
من یه sp دارم که توی اون می خوام تشخیص بدم که آیا پارامترهای پاس شده به sp به عنوان username, password در database هستند یا نه، اگر هستند یه مقدار مثلا شبیه true برگردونم، یا اگه راه دیگه ای داره من رو راهنمایی کنین، کدمن شبیه زیر است:
ALTER PROCEDURE
dbo.SelectUser
(Username varchar(50),
Password varchar(50)
AS
select * from LonIn where (Username = @username and Password = @password)
RETURN
این دستور رو هم برای این نوشتم که یه چیزی حداقل برگردونه که بفهمم آیا درست بوده یانه، اگه باید توی این کد تغییراتی بدم، در قسمت return ویا در قسمت select لطفا راهنمایی کنین
ali_kolahdoozan
یک شنبه 02 تیر 1387, 13:38 عصر
يكي از راههاي شما استفاده از پارامتر خروجي است . كه true يا false را به برنامه پاس بده . يكي ديگرهم ساخت يك datatable از sp در برنامه و كنترل تعداد ركورد بازگشتي است كه نبايد 0 باشه در ضمن از 1 هم بيشتر نباشه
jaza_sa
یک شنبه 02 تیر 1387, 14:51 عصر
مثل همیشه ، برای کار با SQL SERVER نیاز به یکسری نمونه سازی های مقدماتی داریم :
SqlConnection con = new SqlConnection();
SqlCommand cmd = new SqlCommand();
SqlDataAdapter da = new SqlDataAdaptrer();
DataTable dt = new DataTable();
... و حالا برای اجرای STORED PROCEDURE ها از فرامین زیر استفاده میکنیم :
برای اجرای دستورات SELECT :
string SPName = "..."; //Name of stored procedure
cmd.CommandText = SPName;
cmd.Connection = con;
cmd.CommandType = CommandType.StoredProcedure;
da.SelectCommand = cmd;
da.Fill(dt);برای اجرا دستورات اجرایی از قبیل INSERT , UPDATE , DELETE :
string SPName = "..."; //Name of stored procedure
cmd.CommandText = SPName;
cmd.Connection = con;
cmd.CommandType = CommandType.StoredProcedure;
cmd.ExecuteNonQuery();
jaza_sa
یک شنبه 02 تیر 1387, 15:04 عصر
همچنین برای فرستادن مقادیر ورودی به STORED PROCEDURE اینگونه عمل میکنیم :
string SPName = "..."; //Name of stored procedure
SqlCommand cmd = new SqlCommand();
cmd.CommandText = SPName;
cmd.Parameters.Add("@ParamName", SqlDbType).Value = "...";
//For example
cmd.Parameters.Add("@ID", SqlDbType.Int).Value = "1";
cmd.Parameters.Add("@Family", SqlDbType.NVarChar).Value = "Last Name";
//Add all pameters...
//Replace your value for parameters
pars.engineer
یک شنبه 02 تیر 1387, 18:41 عصر
چون مثلا اگر username و password صحيح باشد بايد يك مقدار مثل 1 را باز گرداند،خوب حالا تكليف پارامتر خروجي چه مي شود؟
احمد سامعی
یک شنبه 02 تیر 1387, 20:17 عصر
چون مثلا اگر username و password صحيح باشد بايد يك مقدار مثل 1 را باز گرداند،خوب حالا تكليف پارامتر خروجي چه مي شود؟
ببخشید اما در username و password مقدار خروجی معنی نداره چون فقط چک می شه فقط ورودی داریم مثلاً اگه باشه 1 اگر نه 0
باید یک flag تعریف کنی که تو یک حلقه چک کنه بعد اجازه دسترسی یا خطا در ورودی داده ها بده
razavi_university
دوشنبه 03 تیر 1387, 00:13 صبح
میتونی واسه راحتی یک Select بگذاری (با UserName و Password) و مقدار برگشتی اون که فرقی نمی کنه با چی میگیری (DataTable،DataReader , ...) رو تعداد Rowهای اون رو چک کنی اگر کمتر از 1 بود یعنی هیچ رکوردی با این مشخصات وجود نداشته
نکته:
1- مراقب SQL Injection باش
2- هیچ وقت پسورد رو مستقیم ذخیره نکن (مثلا با MD5 انکریپت کن و...)
gdevnb
دوشنبه 03 تیر 1387, 04:23 صبح
سلام
1- مراقب SQL Injection باش
از پارامترها استفاده کن و دیگه نگران SQL Injection نباش.
pars.engineer
دوشنبه 03 تیر 1387, 08:33 صبح
سلام،
دوستان پاسخ هاي شما در حد يك اشاره به موضوع بحث است.
از پارامترها استفاده کن و دیگه نگران SQL Injection نباش.
اگر مي شود لطف كنيد مثالي بزنيد يا كدي بگذاريد.
چون خود من از اين روش استفاده مي كنم كه پس از پاس كردن UserName و Password با تابع Count در SQL تعداد ركوردهايي كه شرط UserName و Password در آنها صدق مي كند را به عنوان پارامتر خروجي بر مي گرداند، كه بديهي است اين مقدار يا صفر است و يا 1 (چون فيدلهاي UserName و Password كليد اصلي هستند.)
CREATE PROCEDURE sp_Check_Login2
@password char(20),@username char(20),
@count int output
AS
SELECT @count=COUNT(*)
FROM tblLogin
WHERE lgn_Password=@password AND lgn_userName=@username
GO
كه البته حتم دارم اين روش، روش چندان مطلوبي نيست، لذا اگر روش مطلوب و استانداردي براي اين منظور مي شناسيد ممنون مي شوم با ارايه كد يا يك مثال (اگر مثال باشد خيلي بهتر و جامع تر است) راهنمايي كنيد.
************************************************** ********
هیچ وقت پسورد رو مستقیم ذخیره نکن (مثلا با MD5 انکریپت کن و...)
مي شه لطف كنيد در مورد اين روش بيشتر توضيح دهيد.
razavi_university
دوشنبه 03 تیر 1387, 10:57 صبح
در مورد SQL Injection چندین مقاله خوب در سایت هست با جستجو به آنها میرسید
در مورد انکریپت پسورد هم استاد نصیری یک مقاله در این زمینه گذاشته اند و روشهای مختلف رو با هم مقایسه کرده اند
مقاله استاد نصیری (http://barnamenevis.org/forum/showthread.php?t=14191)
اینکریپت کردن کلمه عبور (http://barnamenevis.org/forum/showthread.php?t=84283)
How To: Hash Data with Salt (C#/VB.NET (http://www.obviex.com/samples/hash.aspx)
انکریپت با روش MD5 ( (http://barnamenevis.org/forum/showpost.php?p=473977)از تاپیک 1000 نکته) (http://barnamenevis.org/forum/showpost.php?p=473977)
(http://barnamenevis.org/forum/showpost.php?p=473977)
خوندن اینهم بد نیست (http://barnamenevis.org/forum/showthread.php?t=27983)وداع با MD5 (http://barnamenevis.org/forum/showthread.php?t=27983)
jaza_sa
دوشنبه 03 تیر 1387, 11:47 صبح
در مورد برگرداندن یک مقدار از طرف Stored Procedure باید بگم که ، تا اونجایی که من یادمه
هر Stored Procedure بطور پیش فرض یک مقدار خروجی برمیگردونه که نوع int می باشه ، ولی دقیقا حضور ذهن ندارم که این مقدار دقیقا چی هست و در چه زمانی ، چه مقادیری رو بر میگردونه.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.