PDA

View Full Version : سوال: عدم دسترسی به جدیدترین داده ها



mehran788
شنبه 20 مهر 1392, 09:11 صبح
با سلام و خسته نباشید خدمت دوستان
من برنامه ام رو اینطور طراحی کردم که وقتی کاربر می خواد وارد بشه رمز عبورش بررسی میشه و اگه درست بود یک فیلد تو بانک اطلاعاتی کاربران وجود داره به نام status که اون رو برابر با active قرار میده و فرم بعد رو نمایش میده. حالا تو این فرم به بانک اطلاعاتی نگاه می کنه و هر رکوردی که فیلدش برابر با active بود رو به عنوان کاربری که الان داره از سیستم استفاده می کنه در نظر میگیره.
ولی نمی دونم چرا هیچوقت داده جدید رو فراخوانی نمی کنه مثلا اگه الان کاربر 1 وارد سیستم بشه کاربر قبلی رو میشناسه و اگه بعدا کاربر 2 وارد بشه کاربر کاربر 1 رو میشناسه.

کدی که من تو قسمت لوگین برای اینکار نوشتم اینه
int uncorrect = 0;
string code = "";
if (txtpassword.Text != "" && txtusername.Text != "")
{
SqlCommand com = new SqlCommand("select * from tbluserdata where username='" + txtusername.Text + "'", con);
SqlDataReader dr;
con.Open();
dr = com.ExecuteReader();
if (dr.Read())
{
if (dr["password"].ToString() == txtpassword.Text)
{
frmmain frm = new frmmain();
frm.Show();
this.Hide();
code = dr["code"].ToString();
}
else
{
uncorrect = Convert.ToInt32(dr["uncorrect"].ToString());
code = dr["code"].ToString();
uncorrect++;
txtpassword.Text = "";
txtusername.Text = "";
lbuncorrect.Visible = true;
txtusername.Focus();

}
}
else
{
txtpassword.Text = "";
txtusername.Text = "";
lbuncorrect.Visible = true;
txtusername.Focus();
}
con.Close();
if (uncorrect > 0)
{
com.CommandText = "update tbluserdata set uncorrect='" + uncorrect + "' where code='" + code + "'";
con.Open();
com.ExecuteNonQuery();
con.Close();
}
else
{
com.CommandText = "update tbluserdata set status='Deactive'";
con.Open();
com.ExecuteNonQuery();
con.Close();
com.CommandText = "update tbluserdata set status='Active' where code='" + code + "'";
con.Open();
com.ExecuteNonQuery();
con.Close();
}

و کدی که تو فرم اصلی نوشتم اینه:
string code="";
SqlCommand com = new SqlCommand("select * from tbluserdata where status='Active'",con);
SqlDataReader dr;
con.Open();
dr = com.ExecuteReader();
if (dr.Read())
{
code=dr["code"].ToString();
label1.Text = dr["username"].ToString();
if (Convert.ToInt32(dr["uncorrect"].ToString()) > 0)
{
MessageBox.Show("رمز عبور برای این کاربر " + dr["uncorrect"].ToString() + " بار اشتباه وارد شده است.");
}
if (dr["quantityday"].ToString() == "0")
{
frmfirstrun frm = new frmfirstrun();
frm.ShowDialog();
}
}
con.Close();
com.CommandText = "update tbluserdata set uncorrect='0' where code='" + code + "'";
con.Open();
com.ExecuteNonQuery();
con.Close();


کسی می تونه کمکم کنه؟

pedramfj
شنبه 20 مهر 1392, 14:59 عصر
سلام
اگر اشتباه نکنم مشکل باید از این قسمت باشه

if (dr.Read())

شما فقط در این قسمت یک کاربر را کنترل می کنید. کد بالا را در یک حلقه قرار دهید . به شکل زیر.


while(dr.Read())
{ }

موفق باشید

mehran788
یک شنبه 21 مهر 1392, 07:30 صبح
سلام
اگر اشتباه نکنم مشکل باید از این قسمت باشه

if (dr.Read())

شما فقط در این قسمت یک کاربر را کنترل می کنید. کد بالا را در یک حلقه قرار دهید . به شکل زیر.


while(dr.Read())
{ }

موفق باشید

خیلی ممنون دوست عزیز که وقت گذاشتی ولی بازم جواب نداد و به داده های بروز دسترسی ندارم.
باز هر بار که لوگین می کنم کاربری که دفعه قبل لوگین کرده رو تو لیبل می ندازه.

pedramfj
یک شنبه 21 مهر 1392, 09:22 صبح
سلام
به نظر من اشتباه شما در کد زیر هستش. چون فقط یک بار اطلاعات را می خوانید و بطور مستقیم در لیبل نمایش می دهید


if (dr.Read())
{
code=dr["code"].ToString();
label1.Text = dr["username"].ToString();


در زمان ورود قبل از اینکه فرم اصلی را نمایش دهید نام کاربری را برای فرم اصلی ارسال کنید.
در فرم اصلی هم Select خود را به کد زیر تغییر دهید...

SqlCommand com = new SqlCommand("select * from tbluserdata where status='Active' ANd username='@username'",con);

موفق باشید

mehran788
یک شنبه 21 مهر 1392, 10:04 صبح
سلام
به نظر من اشتباه شما در کد زیر هستش. چون فقط یک بار اطلاعات را می خوانید و بطور مستقیم در لیبل نمایش می دهید


if (dr.Read())
{
code=dr["code"].ToString();
label1.Text = dr["username"].ToString();


در زمان ورود قبل از اینکه فرم اصلی را نمایش دهید نام کاربری را برای فرم اصلی ارسال کنید.
در فرم اصلی هم Select خود را به کد زیر تغییر دهید...

SqlCommand com = new SqlCommand("select * from tbluserdata where status='Active' ANd username='@username'",con);

موفق باشید

من تو همین ارسال مشکل دارم که این کارو کردم. چطور مقدار یک متغییر رو ارسال کنم به فرم؟
من قبلا اینکارو می کردم که یک تکست باکس تو فرم اصلی می ذاشتم و بعد از فرم لوگین مقدار اون تکست باکس رو برابر با یوزر نیم می کردم ولی راه اصولی واسه اینکار بلد نیستم.

pedramfj
یک شنبه 21 مهر 1392, 11:07 صبح
سلام
ساده ترین روش این هستش که یک متغییر static در فرم ورود به شکل زیر تعریف کنید .


static public string userName;

از هر فرمی می توانید دسترسی داشته باشید به این متغییر
موفق باشید

mehran788
یک شنبه 21 مهر 1392, 11:21 صبح
سلام
ساده ترین روش این هستش که یک متغییر static در فرم ورود به شکل زیر تعریف کنید .


static public string userName;

از هر فرمی می توانید دسترسی داشته باشید به این متغییر
موفق باشید

خیلی شرمنده ولی نتونستم استفاده کنم
کد فرم لوگین:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace AdayLitnerBox
{
public partial class frmlogin : Form
{
static public string Code ;
public frmlogin()
{
InitializeComponent();
}

private void frmlogin_Load(object sender, EventArgs e)
{

}

private void tableLayoutPanel1_Paint(object sender, PaintEventArgs e)
{

}

private void btnok_Click(object sender, EventArgs e)
{
int uncorrect = 0;
string code = "";
if (txtpassword.Text != "" && txtusername.Text != "")
{
SqlCommand com = new SqlCommand("select * from tbluserdata where username='" + txtusername.Text + "'", con);
SqlDataReader dr;
con.Open();
dr = com.ExecuteReader();
if (dr.Read())
{
if (dr["password"].ToString() == txtpassword.Text)
{
code = dr["code"].ToString();
Code = code;
frmmain frm = new frmmain();
frm.Show();
//this.Hide();
}
else
{
uncorrect = Convert.ToInt32(dr["uncorrect"].ToString());
code = dr["code"].ToString();
uncorrect++;
txtpassword.Text = "";
txtusername.Text = "";
lbuncorrect.Visible = true;
txtusername.Focus();

}
}
else
{
txtpassword.Text = "";
txtusername.Text = "";
lbuncorrect.Visible = true;
txtusername.Focus();
}
con.Close();
if (uncorrect > 0)
{
com.CommandText = "update tbluserdata set uncorrect='" + uncorrect + "' where code='" + code + "'";
con.Open();
com.ExecuteNonQuery();
con.Close();
}
else
{
com.CommandText = "update tbluserdata set status='Deactive'";
con.Open();
com.ExecuteNonQuery();
con.Close();
com.CommandText = "update tbluserdata set status='Active' where code='" + code + "'";
con.Open();
com.ExecuteNonQuery();
con.Close();
}
}
}

private void txtusername_TextChanged(object sender, EventArgs e)
{
lbuncorrect.Visible = false;
}

private void txtpassword_TextChanged(object sender, EventArgs e)
{
lbuncorrect.Visible = false;
}

private void btnexit_Click(object sender, EventArgs e)
{
Application.Exit();
}

private void lbnewuser_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
frmnewuser frm = new frmnewuser();
frm.Show();
this.Hide();
}
}
}



کد فرم اصلی
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace AdayLitnerBox
{
public partial class frmmain : Form
{
static public string Code;
public frmmain()
{
InitializeComponent();
}

private void frmmain_Load(object sender, EventArgs e)
{

//***login
string code="";
string day = "";
string random = "";
string a = "active";
SqlCommand com = new SqlCommand("select * from tbluserdata where code='"+Code+"'",con);
SqlDataReader dr;
con.Open();
dr = com.ExecuteReader();
while (dr.Read())
{
code=dr["code"].ToString();
day = dr["quantityday"].ToString();
txtday.Text = day;
random = dr["random"].ToString();
lbusername.Text = dr["username"].ToString();
if (Convert.ToInt32(dr["uncorrect"].ToString()) > 0)
{
MessageBox.Show("رمز عبور برای این کاربر " + dr["uncorrect"].ToString() + " بار اشتباه وارد شده است.");
}
if (dr["quantityday"].ToString() == "0")
{
frmfirstrun frm = new frmfirstrun();
frm.ShowDialog();
}
}
con.Close();
com.CommandText = "update tbluserdata set uncorrect='0' where code='" + code + "'";
con.Open();
com.ExecuteNonQuery();
con.Close();
//***Runtime
for (int i = 1; i <= Convert.ToInt32(day); i++)
{
ListBox lst = new ListBox();
lst.Name = "lst" + i;
lst.Text = "";
lst.Width = 287;
lst.Height = 95;
lst.Left = 44;
lst.Top = (95 * (i - 1)) + 60;
Controls.Add(lst);
Label lb = new Label();
lb.Name = "lb" + i;
lb.Text = Convert.ToString(i);
lb.AutoSize = true;
lb.Width = 100;
lb.Height = 95;
lb.Left = 335;
lb.Top = (95 * (i - 1)) +60;
lb.Font=new Font("BKoodak",30,FontStyle.Regular);
lb.ForeColor = Color.Red;
Controls.Add(lb);
}
int sum = (((95 * (Convert.ToInt32(day) - 1)) + (12 * Convert.ToInt32(day)) + 95));
if (sum > this.Height)
{
vsmain.Enabled = true;
vsmain.Minimum = 0;
vsmain.Maximum = sum - (this.Height - (Convert.ToInt32(day) * 12));
vsmain.Maximum = vsmain.Maximum / 3;
}
}

private void vsmain_Scroll(object sender, ScrollEventArgs e)
{
int quantityitem = Convert.ToInt32(txtday.Text);
for (int i = 1; i <= quantityitem; i++)
{
var lst=Controls.Find("lst" + i,true).FirstOrDefault() as ListBox;
lst.Top = ((95 * (i - 1)) + (12 * i)) - (vsmain.Value*3);
var lb = Controls.Find("lb" + i, true).FirstOrDefault() as Label;
lb.Top = ((95 * (i - 1)) + (12 * i)) - (vsmain.Value * 3);
}
}

private void lbusername_Click(object sender, EventArgs e)
{

}

private void btnnewquestion_Click(object sender, EventArgs e)
{
frmnewquestion frm = new frmnewquestion();
frm.Show();
this.Hide();
}
}
}

pedramfj
یک شنبه 21 مهر 1392, 11:34 صبح
یه مثال میزنم امیدوارم بتوانید مشکل را حل کنید
در فرم ورود یک متغیر به شکل زیر تعریف کنید.


static public string username ;


بعد از اینکه این متغیر را تعریف کردین و قبل از اینکه فرم اصلی برنامه را نمایش دهید از کد زیر استفاده کنید


username="pedram";

در فرم اصلی برنامه هم برای دسترسی به این متغیر کافیه بنویسید


MessageBox.Show(frmmain.username);


حالا با استفاده از این روش کد خود را اصلاح کنید

mehran788
یک شنبه 21 مهر 1392, 12:53 عصر
یه مثال میزنم امیدوارم بتوانید مشکل را حل کنید
در فرم ورود یک متغیر به شکل زیر تعریف کنید.


static public string username ;


بعد از اینکه این متغیر را تعریف کردین و قبل از اینکه فرم اصلی برنامه را نمایش دهید از کد زیر استفاده کنید


username="pedram";

در فرم اصلی برنامه هم برای دسترسی به این متغیر کافیه بنویسید


MessageBox.Show(frmmain.username);


حالا با استفاده از این روش کد خود را اصلاح کنید


داداش خیلی ممنون. مشکلم حل شد.
شرمنده اگه سرت رو درد آوردم