PDA

View Full Version : سوال: کد به دست آوردن آخرین کاربر وارد شده در سیستم به صورت Linq



davidrobert
یک شنبه 12 آبان 1392, 15:00 عصر
سلام و خسته نباشید. من برنامه دارم مینویسم وقتی که کاربر وارد برنامه میشه اطلاعات اون شخص نمایش داده میشه در برنامه و معلوم میشه که کسی وارد میشی و وقتی وارد برنامه شد اطلاعات اون کاربر وارد شده ثبت میشه و حالا میخوام به وسیله ساعت و تایمر و همچنین تاریخ خروج معلوم کنیم این طرف چقدر در سیستم بوده. ولی تو نشوتن کد به صورت Linq گیر کردم که بگم آخرین کاربر که وارد شده با این شناسه کی هستش وقتی آخرین کاربر وارد شده با نام کاربری رو شناخت کی بود اطلاعات مروبط به ساعت خروج، تایمر و تاریخ رو ویرایش کنه در برنامه برای اینکار از تایمر استفاده کردم که هر 3 ثانیه اطلاعات آخرین نفر که وارد شده با همین نام کاربری که در سیستم هستش رو شناسای و به روز کنه ولی نمی دونم چطور به این صورت کوئری بنویسم در Linq برای ویرایش اطلاعات. var upquery = (from up in db.tbl_kharids
where up.id == ID
select up).SingleOrDefault();
خیلی ممنون میشم کسی به هم بگه چطور کوئری بنویسم به صورت Linq که بگم آخرین کاربر که در دیتابیس هستش با این نام کاربری چقدر در سیستم قرار داشته ، تاریخ خروج و زمان خروج از سیستم کی بوده. من برای اینکه مدت زمان فرم تو سیستم معلوم بیشه یه تایمر قرار دادم و همچنین یه ساعت که کی از سیستم خارج شده و تاریخ هم قرار دادم ممنون میشم یکی کمک کنه این کورئری رو برای ویرایش اطلاعات آخرین کاربر وارد شده بنویسم خیلی لازم دارم.
از دیتاگرید ویو استفاده نمکنیم از label استفاده میکنم برای نمایش اطلاعات کاربر وارد شده تو سیستم.
منظور من همچین کدی می باشد. این کد ado رو چطور به Linq بنویسم. void UpdateLastRecord()
{
try
{
dbm.cmd.CommandText =
"UPDATE Tbl_InfoLogin SET DateExit = @DateExit, TimetoSystem = @TimetoSystem, TimeExit = @TimeExit WHERE (ID =(SELECT MAX(ID) AS Exper1 FROM Tbl_InfoLogin AS Tbl_InfoLogin_1))";
dbm.cmd.Parameters.Clear();
dbm.cmd.Parameters.AddWithValue("@DateExit", LblShortDate.Text);
dbm.cmd.Parameters.AddWithValue("@TimetoSystem", LblTimer.Text);
dbm.cmd.Parameters.AddWithValue("@TimeExit", Lbltime.Text);
dbm.con.Open();
dbm.cmd.ExecuteNonQuery();
dbm.con.Close();
}
catch (Exception ex)
{
if (!ShowFrindMessage)
PersianMessageBox.Show(ex.Message);
else
PersianMessageBox.Show("خطا در اجرا دستورات / خطا 107", "خطا", PersianMessageBox.Buttons.OK,
PersianMessageBox.Icon.Error);
}
}
خیلی نیاز دارم ممنون میشم کمک کنید من رو.

davidrobert
یک شنبه 12 آبان 1392, 15:55 عصر
خواهش یکی جواب بنده رو بده.

danialafshari
یک شنبه 12 آبان 1392, 16:34 عصر
سلام
متاسفانه اینقدر توضیحات زیاد بود که خوندنشو پشمون شدم
اگر سعی کنید سوالتون رو مختصر و مفید بپرسید فکر می کنم به نتیجه بهتری برسید
حالا نظر من
اگر برنامه فقط یک نسخه داره می تونی از Setting.Setting استفاده کنی و در اون میای اطلاعات آخرین یوزر رو آپدیت می کنی
ولی اگر تحت شبکه هست قضیه فرق میکنه ...
موفق باشید

davidrobert
یک شنبه 12 آبان 1392, 16:50 عصر
برنامه تحت شبکه نیست. برنامه من به این صورت عمل میکنه یک جدول قرار دادم برای ثبت مشخصات کاربر یعنی کاربری که وارد سیستم میشه معلوم باشه که کسی وارد سیستم شده بخاطر همین معلوم بیشه که کسی وارد شده اطلاعات اون کاربر رو در زمان ورود به برنامه ثبت میکنم یعنی وقتی که برنامه باز میشه اطلاعات کاربر وارد شده ثبت میشه. و حالا یه تایمر در برنامه قرار دادم و تو تایمر میخوام بگم آخرین کاربری که وارد شده به سیستم رو بیاد اطلاعات مربوط به تاریخ ، زمان و تایمر رو بر روی همون رکورد ثبت شده قرار بده یا همون ویرایش کنه. یعنی کاربری که وارد سیستم میشه هر 3 ثانیه اطلاعات همون کاربر به روز بیشه.به وسیله ابزار تایمر که قرار دادم. و قتی زمان به تایمر به 3 ثانیه میریسه اطلاعات آخرین کاربری که وارد سیستم شده رو اطلاعات مروبط به ساعت خروج ، تاریخ خروج و تایمری که مدت زمان بودن در سیستم رو مشخص میکنه آپدیت میکنه و وقتی هم شخص از برنامه بخواد خارج بیشه یا برق بره یا هر چیزی دیگه معلوم میشه اون کاربری که وارد سیستم شده چقدر در سیستم بوده. بخاطر همین که معلوم کنم کاربر وارد شده در سیستم چقدر در برنامه بود باید آخرین رکورد رو به دست بیارم که مطلق به همون کاربر باشه. دلیل که نوشتم معلوم بیشه آخرین کاربری که با این شناسه وارد شده این می باشد که این برنامه هم به صورت شبکه هستش و هم نه یعنی 2 تا نسخه میخوام بنویسم بخاطر همین میخواستم آخرین شناسه کاربر وارد شده در سیستم با این نام کاربری معلوم باشه. درست مثل همین کد .ولی تو این کد نام کاربری رو نگفته بلکه فقط اخرین شناسه به دست میاد نه آخرین شناسه این کاربر. این هم کد Ado می باشد . void UpdateLastRecord()
{
try
{
dbm.cmd.CommandText =
"UPDATE Tbl_InfoLogin SET DateExit = @DateExit, TimetoSystem = @TimetoSystem, TimeExit = @TimeExit WHERE (ID =(SELECT MAX(ID) AS Exper1 FROM Tbl_InfoLogin AS Tbl_InfoLogin_1))";
dbm.cmd.Parameters.Clear();
dbm.cmd.Parameters.AddWithValue("@DateExit", LblShortDate.Text);
dbm.cmd.Parameters.AddWithValue("@TimetoSystem", LblTimer.Text);
dbm.cmd.Parameters.AddWithValue("@TimeExit", Lbltime.Text);
dbm.con.Open();
dbm.cmd.ExecuteNonQuery();
dbm.con.Close();
}
catch (Exception ex)
{
if (!ShowFrindMessage)
PersianMessageBox.Show(ex.Message);
else
PersianMessageBox.Show("خطا در اجرا دستورات / خطا 107", "خطا", PersianMessageBox.Buttons.OK,
PersianMessageBox.Icon.Error);
}
}
private void timUpdate_Tick(object sender, EventArgs e)
{
UpdateLastRecord();
} ولی میخواستم این کد Ado رو به Linq تبدیل کنیم ولی نتواستم.

davidrobert
یک شنبه 12 آبان 1392, 17:54 عصر
خواهش یکی کمک کنه. خیلی لازم دارم به همچین کدی به زبان لینکیو.

danialafshari
یک شنبه 12 آبان 1392, 23:49 عصر
سلام
من در نرم افزار به این شکل گزاشتم که یک فیلد در هر جدول به نام مثلا username قرار دادم و در دکمه درج این username که از متغیر میگیره رو در دیتابیس ثبت میکنه در این صورت میشه بعداً هم فهمید که این کاربر چیا ثبت کرده
البته این نظر منه
موفق باشید

Mahmoud.Afrad
دوشنبه 13 آبان 1392, 00:23 صبح
شما کد لاگین و ثبت اطلاعات کاربر ورودی رو بزار. همراه با ساختار جدول لاگ ورود و خروج.

davidrobert
دوشنبه 13 آبان 1392, 01:37 صبح
خیلی ممنون که جواب دادید این سیستم کد نویسی بنده برای ورود به برنامه . به صورت Linq
private void LoginSystem()
{

MD5CryptoServiceProvider md5Hasher = new MD5CryptoServiceProvider();
byte[] hashedDataBytes;
UTF8Encoding encoder = new UTF8Encoding();

string StrPassWord = TxtPassWord.Text;
hashedDataBytes = md5Hasher.ComputeHash(encoder.GetBytes(StrPassWord ));

var query = db.Tbl_Users.Where(d => d.UserName == TxtUsers.Text && d.PassWord == hashedDataBytes);
if (TxtPassWord.Text != "" && TxtUsers.Text != "")
{
if (query.Count() != 0)
{
Program.User = TxtUsers.Text.ToString();
FrmMain fm = new FrmMain();
this.Hide();
fm.ShowDialog();
}
else
{
PersianMessageBox.Show("چنین نام کاربری یافت نشود؟", "خطا", PersianMessageBox.Buttons.OK,
PersianMessageBox.Icon.Error);
TxtUsers.Text = "";
TxtPassWord.Text = "";
}
}
else
{
PersianMessageBox.Show("نام کاربری یا رمز عبور را وارد فرمایید؟", "خطا", PersianMessageBox.Buttons.OK,
PersianMessageBox.Icon.Error);
}
}

private void BtnLogin_Click(object sender, EventArgs e)
{
LoginSystem();
}
این هم کد هم نحوه کد نویسیم در فرم اصلی که اطلاعات نمایش داده بیشه تمام جزیاتش. فقط یه چیزی من در تمام برنامه نمی خوام نمایش اطلاعاتکاربر رو به کار ببرم وقتی دکمه ذخیره زده شد اطلاعات ثبت بیشه فقط در فرم اصلی میخوام به این صورت باشه در Ado نوشتم این نوع کد نویسی خیلی خوب جواب داد.ولی Linq رو تازه شروع کردم بلد نیستم. این هم کد نویسی بنده در صفحه اصلی شامل ، نمایش اطلاعات کاربر و تصویر فقط کد مروبط به قسمت فعال و غیر فعال کردن دکمه رو قرار ندادم چون امدم ذخیره ویرایش و خیلی کاراش رو انجام بدم تا وقتی تمام شد اون امکان رو هم بزارم چون 2 تا دکمه غیر فعال میشن که معلوم نشه برای کاربرن دیگه که کسی وارد شده و کسی نتونه کاربر در سیستم ثبت کنه. کد مبروط به ساعت ، تاریخ که به صورت کلاس از فرم دیگه آمده ، کد مروبط به تایمر برای راه افتادن تامیر در برنامه وقتی 3 ثانیه رسید اطلاعات آخرین کاربر رو ویرایش کنی که تو این ماندم.و کد مروبط به ثبت کار در زمان ورود به برنامه که نوشتم جواب هم میده وقتی طرف وارد میشه اطلاعاتش ثبت میشه در ویرایش تاریخ و زمان خروج و مدت زمان در برنامه هی ویرایش میشن. این هم کد کلی بنده.
ClsNeedCode clsnd = new ClsNeedCode();
ClsPersianDate prsDate = new ClsPersianDate(DateTime.Now);
private static bool showfriendmessageMainUser = true;
DataBaseDataContext db=new DataBaseDataContext();

ClsPersianDate prDate=new ClsPersianDate(DateTime.Now);

public string users = Program.User;

public void UserShowInfo()
{
var query = from myrow in db.Tbl_Users
where myrow.UserName == users
select
new
{
user = myrow.UserName,
sex = myrow.Sex,
namee = myrow.Name,
last = myrow.Last,
showUserInfo = myrow.View_Users_Information,
RegUserInfo = myrow.View_User_Registration,
unitt= myrow.Unit
};
foreach (var ValueFromQuery in query)
{
LblUsers.Text = ValueFromQuery.user;
LblSex.Text = ValueFromQuery.sex;
LblName.Text = ValueFromQuery.namee;
LblLast.Text = ValueFromQuery.last;
LblUnit.Text = ValueFromQuery.unitt;
}
}

public void GetPic()
{
var query = from myrow in db.Tbl_Users
where myrow.UserName == users
select Image.FromStream(new MemoryStream(myrow.Photo.ToArray()));
foreach (Image image in query)
{
pictureBox1.Image = (image);
}
}

void SaveUser()
{
try
{
Tbl_Member_Information_Sheet tbl=new Tbl_Member_Information_Sheet();
MemoryStream ms=new MemoryStream();
pictureBox1.Image.Save(ms,System.Drawing.Imaging.I mageFormat.Png);
byte[] pi = ms.ToArray();
tbl.sex = LblSex.Text.Trim();
tbl.Name = LblName.Text.Trim();
tbl.Last = LblLast.Text.Trim();
tbl.Photo = pi;
tbl.Date = LblDateShort.Text;
tbl.Time = LbLTime.Text;
tbl.In_Time = LblTimer.Text;
tbl.Unit = LblUnit.Text;
db.Tbl_Member_Information_Sheets.InsertOnSubmit(tb l);
db.SubmitChanges();
}
catch (Exception ex)
{
if (!showfriendmessageMainUser)
PersianMessageBox.Show(ex.Message);
else
PersianMessageBox.Show("خطا در اجرا دستورات خطا 104", "خطا", PersianMessageBox.Buttons.OK,
PersianMessageBox.Icon.Error);
}
}
private void FrmMain_Load(object sender, EventArgs e)
{
LblDateShort.Text = clsnd.dateshort(DateTime.Now);
LblDateFull.Text = "آمروز : " + prsDate.CompletePrsDate() + prsDate.taghvim();
LbLTime.Text = clsnd.TimeFull(DateTime.Now);
UserShowInfo();
GetPic();
SaveUser();
}

private void BtnMin_Click(object sender, EventArgs e)
{
this.WindowState = FormWindowState.Minimized;
}

private void TimOclock_Tick(object sender, EventArgs e)
{
LbLTime.Text = clsnd.TimeFull(DateTime.Now);
}
public static int si = 0;
private void TimSayeBan_Tick(object sender, EventArgs e)
{
try
{
string Lstr = "نرم افزار حسابداری سایه بان";
if (LblSayeBan.Text.ToString().Length < Lstr.Length)
{
LblSayeBan.Text = Lstr.Substring(0, si) + "";
si += 1;
}
else
{
LblSayeBan.Text = "";
si = 0;
}
}
catch
{

}
}
void Check_Seconds()
{
string sec, min;
sec = LblTimer.Text.Substring(6, 2);
min = LblTimer.Text.Substring(3, 2);
if (Convert.ToInt32(sec) < 59)
if (Convert.ToInt32(sec) < 9)
sec = "0" + Convert.ToString(Convert.ToInt32(sec) + 1);
else
sec = Convert.ToString(Convert.ToInt32(sec) + 1);
else
{
sec = "00";
Check_Minute();
}
LblTimer.Text = LblTimer.Text.Substring(0, 6) + sec;
}

void Check_Minute()
{
string min, hour;
min = LblTimer.Text.Substring(3, 2);
hour = LblTimer.Text.Substring(0, 2);
if (Convert.ToInt32(min) < 59)
if (Convert.ToInt32(min) < 9)
min = "0" + Convert.ToString(Convert.ToInt32(min) + 1);
else
min = Convert.ToString(Convert.ToInt32(min) + 1);
else
{
min = "00";
if (Convert.ToInt32(hour) < 23)
if (Convert.ToInt32(hour) < 9)
hour = "0" + Convert.ToString(Convert.ToInt32(hour) + 1);
else
hour = Convert.ToString(Convert.ToInt32(hour) + 1);
else
hour = "00";
}
LblTimer.Text = hour + ":" + min + LblTimer.Text.Substring(5, 3);
}
private void TimTimer_Tick(object sender, EventArgs e)
{
Check_Seconds();
}

void UpdateUser()
{
//var query = db.Tbl_Member_Information_Sheets.Max(i => i.ID);
var query =
(from up in db.Tbl_Member_Information_Sheets
where up.ID == db.Tbl_Member_Information_Sheets.Max(i => i.ID)
select up).SingleOrDefault();
string _dateOut = LblDateShort.Text;
string _time = LbLTime.Text;
string _timer = LblTimer.Text;
query.Departure_Date = _dateOut;
query.Time_Out = _time;
query.In_Time = _timer;
db.SubmitChanges();
}
private void TimUpdate_Tick(object sender, EventArgs e)
{
//UpdateUser();
}

Mahmoud.Afrad
دوشنبه 13 آبان 1392, 02:14 صبح
برای پیدا کردن آبجکتی که خودت ایجاد میکنی نیازی نیست دوباره روی دیتابیس کوئری بزنی. کافیه یک فیلد در این فرم ایجاد کنی و یک ارجاع به اون آبجکت رو نگهداری کنی.

private Tbl_Member_Information_Sheets _info;
void SaveUser()
{
try
{
Tbl_Member_Information_Sheet tbl=new Tbl_Member_Information_Sheet();
tbl.sex = LblSex.Text.Trim();
tbl.Name = LblName.Text.Trim();
tbl.Last = LblLast.Text.Trim();
tbl.Date = LblDateShort.Text;
tbl.Time = LbLTime.Text;
tbl.In_Time = LblTimer.Text;
tbl.Unit = LblUnit.Text;
db.Tbl_Member_Information_Sheets.InsertOnSubmit(tb l);
db.SubmitChanges();

_info = tbl;
}
catch (Exception ex)
{
if (!showfriendmessageMainUser)
PersianMessageBox.Show(ex.Message);
else
PersianMessageBox.Show("خطا در اجرا دستورات خطا 104", "خطا", PersianMessageBox.Buttons.OK,
PersianMessageBox.Icon.Error);
}
}

حالا در متد آپدیت این آبجکت رو اصلاح میکنی و تغییرات رو ذخیره میکنی..

void UpdateUser()
{
if (_info != null)
{
string _dateOut = LblDateShort.Text;
string _time = LbLTime.Text;
string _timer = LblTimer.Text;
_info.Departure_Date = _dateOut;
_info.Time_Out = _time;
_info.In_Time = _timer;
db.SubmitChanges();
}
}





من متوجه نشدم چرا عکس رو در جدول Tbl_Member_Information_Sheet ذخیره میکنی. مگر این جدول برای ذخیره اطلاعات ورود و خروج نیست و مگر عکس در جدول Tbl_Users ثبت نشده؟!!

دو تابع که برای چک کردن ثانیه و دقیقه نوشتی اگر برای دو رقمی کردن هست اضافه است. میتونی از فرمت دهی در متد tostring استفاده کنی.

تایمرهای زیادی استفاده کردی، چرا؟ هر کدوم چه کاری میکنند؟

davidrobert
دوشنبه 13 آبان 1392, 12:25 عصر
ممنون آقا Mahmoud.Afrad (http://barnamenevis.org/member.php?71297-Mahmoud.Afrad) درست شد جواب گرفتم.