• 0
Almatrodi

كيف أحفظ تاريخ أم القرى في SQL 2005

سؤال

حاولت البحث ولم أجد حلاً شافياً لهذه المشكلة.

أتمنى أن أجد من مايكروسوفت الدعم الكامل لتقويم أم القرى سواء من ناحية لغات البرمجة كوجود كائن لاختيار التاريخ كما هو الحال في الميلادي. أومن ناحية قواعد البيانات وإيجاد حل لحفظ تاريخ أم القرى والتعامل معه كتاريخ بشكل سهل ومبسط.

قبل أن أطرح السؤال أود إيضاح أنني وجدت مقالة من مايكروسوفت تتكلم عما يسمى بأنواع الحقول المنشأة من قبل المستخدم UDT [هنا الرابط] وحاولت أن أجرب حظي فيها وما عرفت كيف ذلك. حيث قمت:

1. تفعيل CLR في القاعدة المستخدمة.

2. إنشاء مشروع عن طريق الفيجوال ستوديو لإنشاء هذا النوع.

3. نقله إلى SQL 2005.

4. إنشاء حقل من نوع أم القرى الجديد.

لكن لم أستطع استخدامه... لا أدري كيف؟.

فهل منكم من حاول ذلك... آمل منكم الإفادة.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

6 إجابة على هذا السؤال .

  • 0

حسب ما قرأت في الرابط أنه يوجد به الحل لمشكلتك، إذا فما المشكلة بالضبط؟؟

Example: Non-Western Dates

We would like to store date and time values using the Um Al Qura calendar, which is different from the Gregorian calendar used by the SQL Server datetime data type. We would like this data type to have the same basic set of behaviors, namely string conversion, the ability to retrieve date parts, perform date arithmetic, etc.

The following example of a user defined type is a simple implementation of this data type. It uses the UmAlQuraCalendar type, which is new in the .NET Framework, version 2.0. It would be straightforward to augment this example to provide the full compliment of methods needed.

Um Al Qura UDT in C#:

Copy Code

using System;
using System.Data;
using System.Data.Sql;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Globalization;

[Serializable]
[SqlUserDefinedType(Format.Native, IsByteOrdered = true)]
public struct UmAlQuraDateTime : INullable
{

/*
* Private state.
*/

private long dtTicks;
private bool isNull;

// Calendar object used for all calendar-specific operations
private static readonly UmAlQuraCalendar s_calendar =
new UmAlQuraCalendar();

// For correct formatting we need to provie a culture code for
// a country that uses the Um Al Qura calendar: Saudi Arabia.
private static readonly CultureInfo ci =
new CultureInfo("ar-SA", false);


/*
* Null-Handling
*/

// get a null instance
public static UmAlQuraDateTime Null
{
get
{
UmAlQuraDateTime dt = new UmAlQuraDateTime();
dt.isNull = true;
return dt;
}
}

public bool IsNull
{
get
{
return this.isNull;
}
}

/*
* Constructors
*/

public UmAlQuraDateTime(long ticks)
{
isNull = false;
dtTicks = ticks;
}

public UmAlQuraDateTime(DateTime time) : this(time.Ticks)
{
}

/*
* Factory routines.
*/

public static UmAlQuraDateTime Parse(SqlString s)
{
if (s.IsNull) return Null;
DateTime t = DateTime.Parse(s.Value);
return new UmAlQuraDateTime(t);
}

public static UmAlQuraDateTime ParseArabic(SqlString s)
{
if (s.IsNull) return Null;
DateTime t = DateTime.Parse(s.Value, ci);
return new UmAlQuraDateTime(t);
}

public static UmAlQuraDateTime FromSqlDateTime(SqlDateTime d)
{
if (d.IsNull) return Null;
return new UmAlQuraDateTime(d.Value);
}

public static UmAlQuraDateTime Now
{
get
{
return new UmAlQuraDateTime(DateTime.Now);
}
}

/*
* Conversion Routines
*/

public DateTime DateTime
{
get { return new DateTime(this.dtTicks); }
}

public SqlDateTime ToSqlDateTime()
{
return new SqlDateTime(this.DateTime);
}

public override String ToString()
{
return this.DateTime.ToString(ci);
}

public String ToStringUsingFormat(String format)
{
return this.DateTime.ToString(format, ci);
}

/*
* Methods for getting date parts.
*/

public int Year
{
get
{
return s_calendar.GetYear(this.DateTime);
}
}

public int Month
{
get
{
return s_calendar.GetMonth(this.DateTime);
}
}

public int Day
{
get
{
return s_calendar.GetDayOfMonth(this.DateTime);
}
}

/*
* Date arithmetic methods.
*/

public UmAlQuraDateTime AddYears(int years)
{
return new
UmAlQuraDateTime(s_calendar.AddYears(this.DateTime, years));
}

public UmAlQuraDateTime AddDays(int days)
{
return new
UmAlQuraDateTime(s_calendar.AddDays(this.DateTime, days));
}

public double DiffDays(UmAlQuraDateTime other)
{
TimeSpan diff = DateTime.Subtract(other.DateTime);
return diff.Days;
}
}

Once this type is loaded in SQL Server, the type can be used via T-SQL. Here are some T-SQL examples using this UDT along with the results they produce.

First we parse an Um Al Qura date and print it out in two formats along with the western equivalent:

Copy Code

DECLARE @d UmAlQuraDateTime
SET @d = UmAlQuraDateTime::ParseArabic('01/02/1400')
PRINT @d.ToString()
PRINT @d.ToStringUsingFormat('F')
PRINT @d.ToSqlDateTime()

We can convert western dates into Um Al Qura as well:

Copy Code

DECLARE @n DateTime
SET @n = 'March 20, 2005'
DECLARE @d UmAlQuraDateTime
SET @d = UmAlQuraDateTime::FromSqlDateTime(@n)
PRINT @n
PRINT @d.ToString()

Finally, we can create and modify tables with columns of this type:

Copy Code

CREATE TABLE dates (
western DateTime,
umalqura UmAlQuraDateTime
)

INSERT INTO dates(western) VALUES ('June 1, 2005')
INSERT INTO dates(western) VALUES ('July 1, 2005')

UPDATE dates
SET umalqura = UmAlQuraDateTime::FromSqlDateTime(dates.western)

SELECT western, umalqura.ToString() as umalqura FROM dates

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

أخي الكريم...

المشكلة كما ذكرت. حيث قمت بإنشاء النوع وأضفته. لكن لم أستطع أن أتعامل معه كنوع حقل عادي.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

ياجماعة الخير هل الموضوع غير مهم!. أم أنه لا أحد يستخدم تاريخ أم القرى؟.

أتمنى ممن لديه حتى لواقتراح أورابط فيه مزيد من المعلومات أن يزودني به.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

عموماً أحببت أن أنقل لكم آخر ماتوصلت إليه.

اتصلت على مايكروسوفت وأخبروني أنهم قاموا بإعداد UDT ليعمل مع القاعدة وكنت أعتقد أن الـ UDT سينشيء لي نوع حقل تاريخي له جميع مواصفات حقل من نوع تاريخ. لكن للأسف توقعي كان في غير محله.

خلاصة ماتوصلت إليه وما أرى أنه الصحيح للتطبيق هو:

1. في القاعدة أنشيء حقل نوعه تاريخ ميلادي عادي. وذلك للاستفادة من وظائف الحقل التاريخي.

2. أثناء استرجاع البيانات قم بتحويل حقل التاريخ الميلادي إلى تاريخ أم القرى معتمداً على وظائف الدوت نت إصدار 2 وأعلى.

3. في البرنامج استخدم حقل نصي لايقبل إلا أرقام. وتأكد أن الإدخال صحيح. واختبر القيمة المدخلة بأنها متوافقة مع تقويم أم القرى عن طريق وظائف الدوت نت.

4. عند حفظها في القاعدة حول التاريخ إلى ميلادي.

أتمنى ممن لديه تعليق أن يتفضل به...

وعموماً من لم يفهم ماسبق فليتفضل بسؤاله...

وأتمنى لو كنت على قدرة على إنشاء كومبونت من نوع تاريخ أم القرى... لكن الاعتراف بالحق فضيلة.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

أخي الكريم...

أولا شكرا لك.

الرابط الذي ذكرت سبق وأن اطلعت عليه من قبل. ولا أجد فيه جديد. مايكروسوفت من بداية الفريم ورك 2 وهي تدعم تاريخ أم القرى والذي بالطبع هو مبني على جدول يستمر إلى 1450 حسب آخر ماتوصلت إليه مدينة الملك عبدالعزيز.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
زوار
This topic is now closed to further replies.

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .