# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > دسترسی به داده ها (ADO.Net و LINQ و ...) >  درج تاریخ فارسی در sql

## prince-of-persia

سلام
وقتی می خوام این دستور sql رو اجرا کنم 

INSERT INTO LastResTime
                      (uid, LastResTime)
VALUES     ('Kazemi', ' 2008/08/19 11:27:33 ب.ظ')

خطا میده و فهمیدم به خاطر ب.ظ هست و وقتی برش میرام و به جاش pm میگزارم درست میشه 
چطوری این مشکل رو حل کنم ؟
یا چطور کاری کنم که datetime.now() در خروجی amوpm بده ؟

با تشکر

----------


## mehrpars

فیلدت از جنس date هست یا string

----------


## mdssoft

من تو PHP همیشه زمان رو بر حسب تعداد ثانی های سپری شده از یه زمان خاص تو دیتا بیس ( که از نوع int ) است ذخیره می کردم و هنگام نمایش اون رو به تاریخ شمسی تبدیل می کردم.
تو C#‎ هم ، دنبال چنین چیزی می گشتم ، اما خوب اون طور که من می خواستم نتونستم پیدا کنم .
برای همین این DLL رو ساختم که مشکلم رو حل کرد .

----------


## prince-of-persia

datetime هست

----------


## linux

> datetime هست


 cast یادت رفته.

----------


## اَرژنگ

> من تو PHP همیشه زمان رو بر حسب تعداد ثانی های سپری شده از یه زمان خاص تو دیتا بیس ( که از نوع int ) است ذخیره می کردم و هنگام نمایش اون رو به تاریخ شمسی تبدیل می کردم.
> تو C#‎ هم ، دنبال چنین چیزی می گشتم ، اما خوب اون طور که من می خواستم نتونستم پیدا کنم .
> برای همین این DLL رو ساختم که مشکلم رو حل کرد .


چرا دی‌ال‌ال ؟ مگر در دات‌نت از اسمبلی استفاده نمیکنیم؟ سورسش را از کجا میشه بدست آورد؟
 در ضمن در همان صفحه یکی از پستها مشکلات را گفته:

Xaroth wrote:
also, making it an uint assumes that there is nothing prior to 1-1-1970, while there is...

معنیش این است که برایه سالها قبل ۱۹۷۰ کار نمیکند.

----------


## اَرژنگ

> cast یادت رفته.


چجور cast استفاده میشه در این مورد؟

----------


## prince-of-persia

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

فکر کنم یک ربطایی به globalization داشته باشه.
چون من ایران رو موقع نصب ویندوز انتخاب کردم اینطوری میده حالا باید چه کرد که am و pm بده

----------


## linux

> چجور cast استفاده میشه در این مورد؟


حالا cast یا convert که کانورت بهتر هست.

اولا همچین فرمتی در sql شناخته شده نیست.
2008/08/19 11:27:33 ب.ظ
باید تبدیل بشه به CONVERT(DATETIME, '2008-11-28 14:15:34', 102)

----------


## linux

> دوستان فکر نکنم این مشکل اینقدر ها حاد باشه.
> 
> فکر کنم یک ربطایی به globalization داشته باشه.
> چون من ایران رو موقع نصب ویندوز انتخاب کردم اینطوری میده حالا باید چه کرد که am و pm بده


ببین باید از تابع cast یا convert استفاده کنی یا از پارامترها

SqlCommand cmd = new SqlCommand();
           cmd.CommandText = "INSERT INTO dbo.TestCustomer " +
                           "          (uid, LastResTime)" +
                           "VALUES     (@uid, @LastResTime)";
           SqlParameter p1 = new SqlParameter();
           SqlParameter p2 = new SqlParameter();
           p1.DbType = DbType.String;
           p1.ParameterName = "@uid";
           p1.Value = "Test";
           p2.DbType = DbType.DateTime;
           p2.ParameterName = "@LastResTime";
           p2.Value = DateTime.Now;
           cmd.Parameters.Add(p1);
           cmd.Parameters.Add(p2);
           cmd.Connection = new SqlConnection("Your Connection String Here");
           cmd.Connection.Open();
           cmd.ExecuteNonQuery();
           cmd.Connection.Close();

----------


## prince-of-persia

برنامه من از 3 لایه تشکیل شدن یعنی :
اول:
            LastResTimeClass LRC = new LastResTimeClass();
            LRC.Add(id,DateTime.Now);

دوم :
 public void Add(string uid, DateTime LastResTime)
    {
        string Sql = "insert into LastResTime (uid,LastResTime) values ('{0}',{1})";
        Sql = string.Format(Sql,uid, LastResTime);
        db.Connect();
        db.DoCommand(Sql);
        db.Disconnect();
    }

سوم:
  public void DoCommand(string sql)
    {
        cmd.CommandText = sql;
        cmd.ExecuteNonQuery();
    }

این یعنی من باید یک رشته رو به لایه های پایین تر بفرستم حالا این مشکلو چطور حل کنم ؟
البته ایده پارامتر ها فکر کنم صحیح ترین راه است اما من این مشکل رو دارم که امیدوارم با کمک شما حل بشه .

ممکنه اون convert رو یکم کامل تر توضیح بدبد ؟

با تشکر

----------


## linux

> برنامه من از 3 لایه تشکیل شدن یعنی :
> اول:
>             LastResTimeClass LRC = new LastResTimeClass();
>             LRC.Add(id,DateTime.Now);
> 
> دوم :
>  public void Add(string uid, DateTime LastResTime)
>     {
>         string Sql = "insert into LastResTime (uid,LastResTime) values ('{0}',{1})";
> ...


احتیاجی نیست پارامتر به مرحله 2 بفرستی در مرحله 2 از روشی که گفتم استفاده کن

----------


## prince-of-persia

میتونم اما این کار نظم برنامه رو بهم میرزه
چطور باید به رشته تبدیلش کنم و به لایه های پایین تر بفرستمش ؟

----------


## linux

> میتونم اما این کار نظم برنامه رو بهم میرزه
> چطور باید به رشته تبدیلش کنم و به لایه های پایین تر بفرستمش ؟


   public void Add(string uid, DateTime LastResTime)
        {
            string Sql = "insert into LastResTime (uid,LastResTime) values (@uid,@LastResTime)";
            //
            SqlParameter p1 = new SqlParameter();
            SqlParameter p2 = new SqlParameter();
            p1.DbType = DbType.String;
            p1.ParameterName = "@uid";
            p1.Value = uid;
            p2.DbType = DbType.DateTime;
            p2.ParameterName = "@LastResTime";
            p2.Value = LastResTime;
            ///
            List<SqlParameter> pList = new List<SqlParameter>();
            pList.Add(p1);
            pList.Add(p2);
            db.Connect();
            db.DoCommand(Sql,pList );
            db.Disconnect();
        }
public void DoCommand(string sql,List<SqlParameter> parameters)
        {
            
            cmd.CommandText = sql;
            if (parameters != null)
            {
                foreach (SqlParameter p in parameters)
                {
                    cmd.Parameters.Add(p);
                }
            }            
            cmd.ExecuteNonQuery();
        }

----------


## programmable

اساتید فکر نمی کنید این مشکل با یه تکه کد کوچک در فابل Program.cs حل بشه؟  :


Application.CurrentCulture= new System.Globalization.CultureInfo("fa-IR");
Application.CurrentCulture.DateTimeFormat.PMDesignator = "PM";
Application.CurrentCulture.DateTimeFormat.AMDesignator = "AM";

----------


## mahsa heydari

سلام 
بهتره توی پایگاه داده تاریخ از نوع string باشه بعد برای نمایش،اونو تبدیل به تاریخ شمسی کنید

----------


## yasercomeng

اصلاً چه نيازي به اين كاراست؟
چرا مي خواين ب.ظ رو تويه پايگاه ذخيره كنيد؟
به نظر خيلي راحتتريد تا تاريخ رو به فرم ٢٤ ساعته ي اون ذخيره كنيد.
اين تيكه كد كه از MSDN هست شايد كمكتون كنه.
DateTime july28 = new DateTime(1979, 7, 28, 5, 23, 15, 16);

			string[] july28Formats = july28.GetDateTimeFormats();

			// Print out july28 in all DateTime formats using the
			// default culture.
			foreach (string format in july28Formats) {
				System.Console.WriteLine(format);
			}

			IFormatProvider culture = 
				new System.Globalization.CultureInfo("fr-FR", true);
			// Get the short date formats using the "fr-FR" culture.
			string [] frenchJuly28Formats = 
						july28.GetDateTimeFormats('d', culture);

			// Print out july28 in various formats using "fr-FR" culture.
			System.Console.WriteLine("Starting fr-FR formats");
			foreach (string format in frenchJuly28Formats) {
				System.Console.WriteLine(format);
			}

متد GetDateTimeFormats يه مدل overload شده داره كه يه كاركتر مي گيره، كاراكتر g رو بهش بدي تمام نتايجي رو كه بخواي بهت مي ده.موفق باشي

----------

