PDA

View Full Version : سوال: مشکل با نمایش داده ذخیره شده در SQL در datagridview



reza1011
چهارشنبه 06 خرداد 1394, 09:40 صبح
با سلام خدمت دوستان بنده یه پروژه ای دارم که چند تا مشکل کوچیک دارم در حال حاضر مشکلم اینه که با کد زیر که که داده ها ذخیره میشن :

{
tim.Stop();
PersianCalendar persianCalendar = new PersianCalendar();
string tarikh = persianCalendar.GetYear(DateTime.Now).ToString() + "/" + persianCalendar.GetMonth(DateTime.Now).ToString() + "/" + persianCalendar.GetDayOfMonth(DateTime.Now).ToStri ng();
using (SqlConnection connection = new SqlConnection("Data Source=.;Initial Catalog=db3;Integrated Security=True"))
{
SqlCommand cmd = new SqlCommand("INSERT INTO phone (date, number, problem, area, gender, duration) VALUES (@date, @number, @problem, @area, @gender, @duration)");
cmd.CommandType = CommandType.Text;
cmd.Connection = connection;
cmd.Parameters.AddWithValue("@date", tarikh);
cmd.Parameters.AddWithValue("@number", bedoonmosavi.Text);
cmd.Parameters.AddWithValue("@problem", problem.Text);
cmd.Parameters.AddWithValue("@area", label19.Text);
cmd.Parameters.Add("@duration", textBox3.Text);
if (radioMale.Checked)
cmd.Parameters.AddWithValue("@gender", "مرد");
else
cmd.Parameters.AddWithValue("@gender", "زن");
connection.Open();
cmd.ExecuteNonQuery();
}
this.Close();
this.showstatus = false;
}
داده ها در SQL ذخیره می شوند و هیچ مشکلی هم ندارند
131695
موقع لود کردن بنده فقط Data Source رو برای Data Gridview متصل کردم به دیتابیس SQL که وقتی فرم لود میشه تمامی داده های سیو شده درست نمایش میده الا ستون Duration که مدت زمان سپری شده هست
131694

ممنون میشم راهنمایی کنید مشکل کجاست؟

Davidd
چهارشنبه 06 خرداد 1394, 09:58 صبح
سلام. اگه Duration یک بازه زمانی هست نباید از DateTime استفاده کرد. برای بازه زمانی از کلاس TimeSpan استفاده میشه. برای ذخیره در دیتابیس میتونی یه ستون از نوع bigint در نظر بگیری و پراپرتی Ticks از TimeSpan ذخیره کنی و برای نمایش باید به TimeSpan تبدیل بشه.
اما یه راه دیگه هم اینه که به صورت یک رشته در دیتابس ذخیره کنی مثلا '23:02' ( این روش در صورتی مناسبه که نخوای روی این فیلد فیلتر اعمال کنی)

reza1011
چهارشنبه 06 خرداد 1394, 10:12 صبح
سلام. اگه Duration یک بازه زمانی هست نباید از DateTime استفاده کرد. برای بازه زمانی از کلاس TimeSpan استفاده میشه. برای ذخیره در دیتابیس میتونی یه ستون از نوع bigint در نظر بگیری و پراپرتی Ticks از TimeSpan ذخیره کنی و برای نمایش باید به TimeSpan تبدیل بشه.
اما یه راه دیگه هم اینه که به صورت یک رشته در دیتابس ذخیره کنی مثلا '23:02' ( این روش در صورتی مناسبه که نخوای روی این فیلد فیلتر اعمال کنی)


ممنون بابات پاسخی دهی ولی منظورتون رو راجب بازه زمانی نفهمیدم این تایم هم همون تایم سپری شده هست Elapsed Time زمانی که فرم دوم باز میشه با یه Event ای این تایمر از 0 شروع میشه میره بالا حالا هر تایمی که پر شده مثلا 1 دقیقه و 15 ثانیه بنده دکمه سیو رو که میزنم که کد هاش دقیقا همین ها هست که در پست اول گذاشتم این تایم سپری شده به صورت صحیح در SQL گویا سیو میشه
مشکل بنده اصلا توی این قسمت ذخیره سازی نیست !!!

مشکلم اینه موقع فراخوانی کل داده های جدول در DataGridview این ستون بخصوص Duration یا زمان سپری شده همان مقدار SQL رو لود نمی کنه انگار قبلش یه تبدیل میزنه به تاریخ کامل و بعد نمایش میده که نمی دونم دردش از کجاست
نوع ستون هم در SQL از نوع Nvarchar تعریف کردم که موقع ذخیره از TextBox مشکلی نداشته باشم

asman.abi
چهارشنبه 06 خرداد 1394, 12:15 عصر
در این کد چی ذخیره می شه. دستور باید value یا مقداری داشته باشه

cmd.Parameters.Add("@duration", textBox3.Text);

این جور بشه. اگه زمان سپری شده در textBox3 قرار داشته باشه.

cmd.Parameters.AddWithValue("@duration", textBox3.Text);

ebrahim.rayatparvar
چهارشنبه 06 خرداد 1394, 12:31 عصر
cmd.Parameters.Add("@duration", textBox3.Text);


مهندس جان سلام اگه دارین از متد Add استفاده میکنید بهتر از این مدل استفاده کنید یا درستش به این روش هست :


cmd.Parameters.Add("@duration", SqlDbType.NVarChar).Value = textBox3.Text;

reza1011
چهارشنبه 06 خرداد 1394, 15:43 عصر
مهندس جان سلام اگه دارین از متد Add استفاده میکنید بهتر از این مدل استفاده کنید یا درستش به این روش هست :


cmd.Parameters.Add("@duration", SqlDbType.NVarChar).Value = textBox3.Text;


برای بنده فرقی نمی کنه چه متودی باشه حتی مثل بقیه از Addwithvalue هم استفاده کردم
این متد هم استفاده کردم نتیجه یکی بود حتی با اینکه توی این روش Data type هم مشخص شده موقع نمایش در برنامه سی شارپ(datagridview) باز به صورت تاریخ نمایش میده

البته من دیتابیس رو هم bind کردم به datagridview که خودش یه دستور
this.phoneTableAdapter7.Fill(this.db3DataSet4.phon e);

در formload قرارمیده که کل داده ها پر میشن ولی این ستون Duration همچنان به صورت تاریخ میاد !!:ناراحت:




راستی تایمر هم بدین صورت نوشته شده :


//timer
Timer tim = new Timer();
long sec = 0;
//
public Form2()
{
InitializeComponent();


}

//timer
void t_Tick(object sender, EventArgs e)
{
seC++‎‎‎‎;
if (textBox3.InvokeRequired)
{
Action act = () => textBox3.Text = string.Format("{0:00}:{1:00}", sec >= 60 ? sec / 60 : 0, sec < 60 ? sec : sec % 60);
textBox3.Invoke(act);
}
else
{
textBox3.Text = string.Format("{0:00}:{1:00}", sec >= 60 ? sec / 60 : 0, sec < 60 ? sec : sec % 60);
}

Mahmoud.Afrad
چهارشنبه 06 خرداد 1394, 17:19 عصر
نوع ستون duration رو به Time(7) تغییر بده. در اینصورت فرمت ذخیره به hh:mm:ss تغییر میکنه و البته باید کنترل کنی مقادیر از حد مجاز فراتر نروند.

راه بهتر شاید همون استفاده از TimeSpan هست.

reza_ali202000
پنج شنبه 07 خرداد 1394, 03:08 صبح
فرمت فیلدی که توی دیتاگریدویو هست رو تبدیل کن به کامبو باکس ببین بازم همینجوری هس یا نه. اگه درست شد تبدیلش کن به لیبیل جتما درست میشه انشالله

reza1011
جمعه 08 خرداد 1394, 09:56 صبح
نوع ستون duration رو به Time(7) تغییر بده. در اینصورت فرمت ذخیره به hh:mm:ss تغییر میکنه و البته باید کنترل کنی مقادیر از حد مجاز فراتر نروند.

راه بهتر شاید همون استفاده از TimeSpan هست.


ممنون بابات پیگیری

ولی تایم ها توی ستون SQL تغییر کردند و از ثانیه پریدن به دقیقه و زمان لود شدن به DGV هم ارور دارم::ناراحت:
131762



فکر کنم مشکل از تایمر باشه کلا چون با اجرا شدن یه Event دیگه شروع میکنه به شمردن و چون فرمت مناسبی نداره موقع سیو و یا لود شدن مشکل پیش میاد

نمیشه یه تایمر ساده با TimeSpan نوشت که با اجرا شدن فرم دوم شروع کنه به شمردن ؟ که راحت بشه سیو کرد در SQL و این مشکلات اینچنینی و پیش نیاره؟

asman.abi
شنبه 09 خرداد 1394, 16:16 عصر
برادر من یه برنامه کوچیک نوشتم برای این مورد و تایمر دستی ساده (ساده ترین طرحی که تا الان نوشتم!) برای اون طراحی کردم که هر جا شما بخوای میشه ذخیره کرد و در sql امتحان کردم. فایل پروژه و تصویر از اون هم اینجا گذاشتم تا به دردت بخوره.

ابتدا یه تایمر در پروژه قرار می دیم و در form load کد زیر را:
private void Form1_Load(object sender, EventArgs e)
{
timer1.Start();
timer1.Interval = 1000;

}

در قسمت timer_tick کد زیر را قرار می دیم. البته من دو متغییر ثانیه و دقیقه رو سراسری زدم چون می خواستم به صورت رشته در کد درج(بعد این کد گذاشتم:لبخند:) ذخیره کنم.

short s = 0;
short m = 0;

private void timer1_Tick(object sender, EventArgs e)
{
s+=1;
if (s == 60)
{
s = 0;
m += 1;
}
}

ودر آخر ذخیره

SqlCommand a = new SqlCommand("insert into Table_1(saa) values('" + m.ToString() + ":" + s.ToString() + "')", c);
c.Open();
a.ExecuteNonQuery();
c.Close();
در اینجا saa همون duration هست. (دستم گرفت شد saa :لبخند:)


تصویری از روال برنامه

131807

reza1011
یک شنبه 10 خرداد 1394, 14:53 عصر
ممنون بابات کد بالا تایمر ساده ای که نوشتی خیلی نظرم جلب کرد فقط تا چد میشموره؟ 1 ساعت؟ مثلا 4 ساعت و 35 دقیقه و 26 ثانیه و نشون نمیده (4:35:26)؟

بعد کدی که بابت ذخیره در SQL نوشتی به صورت تکی ای هست اگر پست های من دیده باشی من حداقل 10 ستون میخوام همزمان موقع ثبت رکورد سیو بشه که این مدزمان سپری شده یه ستونه که باهاش مشکل داشتم اونم نه تو سیو کردن!! موقع نمایش تو دیتا گرید
حالا سعی می کنم کد ها و ادغام کنم ببینم چی میشه :متفکر::لبخند:

ممنون بابات پیگیری و کد نویسی خیلی مردی...

asman.abi
یک شنبه 10 خرداد 1394, 23:53 عصر
ممنون بابات کد بالا تایمر ساده ای که نوشتی خیلی نظرم جلب کرد فقط تا چد میشموره؟ 1 ساعت؟ مثلا 4 ساعت و 35 دقیقه و 26 ثانیه و نشون نمیده (4:35:26)؟

بعد کدی که بابت ذخیره در SQL نوشتی به صورت تکی ای هست اگر پست های من دیده باشی من حداقل 10 ستون میخوام همزمان موقع ثبت رکورد سیو بشه که این مدزمان سپری شده یه ستونه که باهاش مشکل داشتم اونم نه تو سیو کردن!! موقع نمایش تو دیتا گرید
حالا سعی می کنم کد ها و ادغام کنم ببینم چی میشه :متفکر::لبخند:

ممنون بابات پیگیری و کد نویسی خیلی مردی...

آره چرا نمی شه. اتفاقا من نوشتم دیدم شما تو شماتیک کارت دقیقه بود من دیگه ساعت رو حذف کردم. خیلی ساده میشه روز، هفته، ماه و سال هم اضافه کرد.
اگه می خوای با ساعت بگم. یعنی چیزی که شما گفتید.:لبخندساده:
اینا منطق کد نویسی هست شما اگه مسئله رو بفهمی می تونی پیچیده ترین کار ها رو ساده حل کنی. (خصوصیت منه)
چون سریع کد رو نوشتم فقط duration که مدت زمان سپری شده رو می خواستی ذخیره کردم. شما می تونی ادامه دستور ذخیره من، تغییراتتو اعمال کنی. الان با این روش ذخیره به مشکل بر نمی خوری. مقدار فیلد duration در پایگاه هم nchar یا nvarchar کن.
خواستی بیشتر توضیح می دم.

موفق باشید

reza1011
دوشنبه 11 خرداد 1394, 10:11 صبح
آره چرا نمی شه. اتفاقا من نوشتم دیدم شما تو شماتیک کارت دقیقه بود من دیگه ساعت رو حذف کردم. خیلی ساده میشه روز، هفته، ماه و سال هم اضافه کرد.
اگه می خوای با ساعت بگم. یعنی چیزی که شما گفتید.:لبخندساده:
اینا منطق کد نویسی هست شما اگه مسئله رو بفهمی می تونی پیچیده ترین کار ها رو ساده حل کنی. (خصوصیت منه)
چون سریع کد رو نوشتم فقط duration که مدت زمان سپری شده رو می خواستی ذخیره کردم. شما می تونی ادامه دستور ذخیره من، تغییراتتو اعمال کنی. الان با این روش ذخیره به مشکل بر نمی خوری. مقدار فیلد duration در پایگاه هم nchar یا nvarchar کن.
خواستی بیشتر توضیح می دم.

موفق باشید

سلام ممنون بابات کد تایمر که تا ساعت پیش بره فکر کنم اینشکلی بشه البته اگه جایی ناقص هست بگید


public void timer1_Tick(object sender, EventArgs e)
{
{
s += 1;
if (s == 60)
{
s = 0;
m += 1;
}
} while (m==60)
{
s = 0;
m = 0;
h += 1;
}
}



نوع ستون Duration از اول هم nvarchar بود ولی دیگه اینقدر پرسجو کردم راجب این قضیه دچار کلی تغییر تحولات شد که باز گذاشتمش فرمت قبلی که بود همون nvarchar ()100

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

راستی میشه زمان لود شدن فرم زمان سپری شده رو ببینم تو یه تکست باکسی یا لیبلی چیزی ؟ چون اینجوری خودش میشموره و سیو میشه و تازمانی که داده توی دیتا گرید لود نشن متوجه نمیشم چقدر تایم سیو شده منظورم اینه از همون ثانیه اول که داره میشموره به صورت آنی ببینم تایم و

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

asman.abi
دوشنبه 11 خرداد 1394, 13:03 عصر
این کار خیلی ساده حل میشه. منظور م از سادگی در نظر بعضی شاید پیچیده باشه ولی سعی بر این دارم ساده ولی با کارایی بالا حل کنم. تعریف از خود نباشه ها:افسرده: گفتم بقیه با مشکل ساده برخورد کنن به مرور حل میشه.

برای کد هم از if های تو در تو استفاده کن من با اون میذارم. ولی روال همونه که نوشتی.

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

راستی میشه زمان لود شدن فرم زمان سپری شده رو ببینم تو یه تکست باکسی یا لیبلی چیزی ؟ چون اینجوری خودش میشموره و سیو میشه و تازمانی که داده توی دیتا گرید لود نشن متوجه نمیشم چقدر تایم سیو شده منظورم اینه از همون ثانیه اول که داره میشموره به صورت آنی ببینم تایم و




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

reza1011
دوشنبه 11 خرداد 1394, 16:44 عصر
این کار خیلی ساده حل میشه. منظور م از سادگی در نظر بعضی شاید پیچیده باشه ولی سعی بر این دارم ساده ولی با کارایی بالا حل کنم. تعریف از خود نباشه ها:افسرده: گفتم بقیه با مشکل ساده برخورد کنن به مرور حل میشه.

برای کد هم از if های تو در تو استفاده کن من با اون میذارم. ولی روال همونه که نوشتی.


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


دمت گرم ولی یه فکری هم به حال قسمت های شرطی کن مثل جنسیت چون با این روش نمیشه مقدار شرطی سیو کرد ولی تو روش استاندارد پارامتریک خیلی راحت میشد...

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

asman.abi
دوشنبه 11 خرداد 1394, 17:43 عصر
شما می تونی همین رو به صورت پارامتری بدی. ولی چون عادت دارم خیلی کد اضافی نزنم کلا به صورت خطی نوشتم.

تصویری از برنامه

131873

فایل پروژه در ضمیمه طبق نیاز شما

در این جا ساعت تا مقدار زیادی می ره جلو. یعنی محدودیتی براش قرار داده نشده. مثلا 135 ساعت و 2 دقیقه و 26 ثانیه

reza1011
سه شنبه 12 خرداد 1394, 09:12 صبح
شما می تونی همین رو به صورت پارامتری بدی. ولی چون عادت دارم خیلی کد اضافی نزنم کلا به صورت خطی نوشتم.

تصویری از برنامه

131873

فایل پروژه در ضمیمه طبق نیاز شما

در این جا ساعت تا مقدار زیادی می ره جلو. یعنی محدودیتی براش قرار داده نشده. مثلا 135 ساعت و 2 دقیقه و 26 ثانیه


اقا fsdhv عالی بود ولی من هنوز نفهمیدم چه طور شرطی به این طریق سیو کنم از طریق Radio button که نمیشد واسه همین یه کمبو باکس ساختم و ایند کد و گذاشتم تو کد ها که دیدم خالی(null) سیو میکنه

'"+gendercombo.SelectedValue+"'