PDA

View Full Version : نحوه خواندن اطلاعات با استفاده از دیتا ریدر



میلاد قاضی پور
پنج شنبه 13 خرداد 1389, 20:22 عصر
سلام . من یه جدول دارم که کاربران برنامه رو در خودش نگه میداره و برای هرکدوم یوزر و پسورد وجود داره . میخوام هنگامی که روی دکمه لاگین کلیک میشه اطلاعات مخصوص کاربر رو از دیتابیس بخونه و یوزر و پسور رو با هم تطبیق بده .این یک تابع هست که قراره توی باتون مربوطه فراخوانی بشه . آیا این طوری باید نوشت یا با روش دیگه ای؟



ارور :

The parameterized query '(@name nvarchar(4000),@lname
nvarchar(4000),@semat nvarchar(4000' expects the parameter '@name', which was not supplied.





selCommand.Connection = connection;
selCommand.CommandText = "SELECT * FROM users where [username]='"+f2.textBoxX1_uname.Text+"'";

selCommand.Parameters.Add("@name", SqlDbType.NVarChar);
selCommand.Parameters.Add("@lname", SqlDbType.NVarChar);
selCommand.Parameters.Add("@semat", SqlDbType.NVarChar);
selCommand.Parameters.Add("@lastlogin", SqlDbType.DateTime);
selCommand.Parameters.Add("@loginterm", SqlDbType.DateTime);
selCommand.Parameters.Add("@username", SqlDbType.NVarChar);
selCommand.Parameters.Add("@pass", SqlDbType.NVarChar);
selCommand.Parameters.Add("@sabtkonande", SqlDbType.NVarChar);
selCommand.Parameters["@username"].Value = f2.textBoxX1_uname.Text;


dataReader = selCommand.ExecuteReader();

while (dataReader.Read())
{
if (f2.textBoxX2_pass.Text == dataReader["pass"].ToString())
{
Close();
f1.Show();
}
else
MessageBox.Show("نام کاربری یا کلمه عبور وارد شده فاقد اعتبار است", "خطا", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}

میلاد قاضی پور
پنج شنبه 13 خرداد 1389, 22:02 عصر
با حذف قسمت مربوط به اضافه کردن پارامتر ها ارور قبلی بر طرف شد و کد به این صورت درومد. اینبار ارور :Invalid attempt to read when no data is present.




selCommand.Connection = connection;
selCommand.CommandText = "SELECT * FROM users where [username]='"+f2.textBoxX1_uname.Text+"'";


f2.textBoxX1_uname.Text;


dataReader = selCommand.ExecuteReader();


if (f2.textBoxX2_pass.Text == dataReader["pass"].ToString())
{
this.Close();
f1.Show();
}
else
MessageBox.Show("نام کاربری یا کلمه عبور وارد شده فاقد اعتبار است", "خطا", MessageBoxButtons.OK, MessageBoxIcon.Error);

dataReader.Close();
connection.Close();

Sajjad.Aghapour
پنج شنبه 13 خرداد 1389, 22:13 عصر
جواب شما این نیست ولی اصولیش اینه که نحوه نوشتن Query خود رو عوض کنید و هر دو شرط رو در خود Query بیان کنید


cmd.CommandText="select * from users where username='sa' and pass='da';

.
.
if(!reader.Read())
//it's incorrect
else
//it'e correct
.
.

میلاد قاضی پور
پنج شنبه 13 خرداد 1389, 22:35 عصر
با تشکر از شما تغییرات لازم رو که گفتید ایجاد کردم . البته شرطی که شما نوشتید رو ننوشتم چون اون شرط اونطوری که باید عمل نمیکنه . هر کاربری رو قبول میکنه .
ارور همچنان پابرجاست...

میلاد قاضی پور
پنج شنبه 13 خرداد 1389, 23:13 عصر
ازونجایی که اگر حتی یک رو در نتیجه داشته باشیم پس مثل این هست که شرط برقرار شده پس از پراپرتی hasrows استفاده کردم . اما نمیدونم چرا کار نمیکنه :
تحت هر شرایطی اعلام میکنه یوزر پس اشتباس. یعنی هیچ سطری رو نمیاره



selCommand.Connection = connection;
selCommand.CommandText = "SELECT * FROM users where username='"
+f2.textBoxX1_uname.Text+"' and pass='"+textBox4_pass.Text+"'";

dataReader = selCommand.ExecuteReader();

if (dataReader.HasRows)
{
f1.Show();
this.Close();
}
else
MessageBox.Show("نام کاربري يا کلمه عبور وارد شده فاقد اعتبار است", "خطا", MessageBoxButtons.OK, MessageBoxIcon.Error);

dataReader.Close();
connection.Close();

saman2
چهارشنبه 10 فروردین 1390, 02:04 صبح
دوست عزيز! گرچه بعد از گذشت اين مدت قاعدتا شما به نتيجه رسيدي، اما من هم همين مشكل رو دارم.
اگر اطلاعات ديتابيس شما غيرعددي هست، احتمال مي دم ارور مذكور به همين دليل باشه، چون من توي برنامم تا وقتي اطلاعات ديتابيس و فيلدي كه ميخواستم چك كنم، عددي بود اين متد بطور صحيح كار مي كرد. اما وقتي بهمراه عدد، حروف هم وارد كردم، Exception‌ داد!
حالا هم واقعا نمي دونم دليلش چيه؟ دو مورد رو هم اضافه كنم كه اولا: فيلد مورد نظر بصورت nchar تعريف شده. ثانيا: در يك فرم ديگه از برنامه مشابه اين عمليات رو با متد Executescalar انجام دادم كه بطور صحيح كار ميكنه.
ممنون ميشم از دوستان اگر راهنمايي كنن...

saman2
پنج شنبه 11 فروردین 1390, 02:10 صبح
انگار خيلي هم بيراه نيست كه بعضيا ميگن تحريم باعث پيشرفت ميشه! :چشمک:
بعد از اينكه هيچ دوستي راهنماييم نكرد، خودم سعي كردم مشكل رو برطرف كنم و خوشبختانه تونستم! حالا هم براي استفاده احتمالي دوستان ديگه جريان رو ميگم:
مشكل از اينجا بود كه متد ExecuteReader با داده هاي كاملا عددي و تركيب حرفي-عددي به يك شكل كار نميكنه. شما اگر توي ديتابيستون داده هاي كاملا عددي داشته باشيد نيازي به كار خاصي نداريد، اما اگر حرفي-عددي باشن، بايد مثل خود sql اين رشته رو داخل ' ' قرار بدين تا دچار Exception نشيد...