2011-08-14 26 views
16

में डालने से पहले डेटटाइम मान्य करें क्या उचित तालिका में डालने से पहले datetime फ़ील्ड को सत्यापित करने का कोई तरीका है?SQL सर्वर डेटाबेस

कोशिश/पकड़ ब्लॉक के साथ सम्मिलित करने का प्रयास करना एक तरीका नहीं है।

धन्यवाद,

+0

आप डेटा कैसे डालने कर रहे हैं? इसके अलावा, आप किस प्रकार की सत्यापन के बारे में बात कर रहे हैं? एक निश्चित सीमा के भीतर या यह एक वैध प्रारूप है? – iamkrillin

उत्तर

23

यह सुनिश्चित नहीं है कि मैं अत्यधिक पेडेंटिक हूं, लेकिन डेटटाइम। ट्राईपर्स मान्य करेगा कि कोई मान मान्य है या नहीं डेटटाइम ऑब्जेक्ट। ओपी ने SQL सर्वर डेटाटाइम में डालने से पहले एक मान सत्यापित करने के बारे में पूछा। SQL सर्वर datetime के लिए स्वीकार्य मानों की सीमा "जनवरी 1, 1753, 31 दिसंबर, 99 99 के माध्यम से" है, यह डेटटाइम .NET ऑब्जेक्ट्स के लिए सही नहीं है। यह स्क्रिप्ट badDateTime को "1/1/0001 12:00:00 AM" का मान निर्दिष्ट करती है और यह सफलतापूर्वक पार्स करती है।

DateTime d = DateTime.MinValue; 
string badDateTime = DateTime.MinValue.ToString(); 
Console.WriteLine(badDateTime); 
DateTime.TryParse(badDateTime, out d); 

हालांकि, अगर आप स्टोर करने के लिए है कि एक datetime क्षेत्र में प्रयास किया, इसके साथ विफल हो जाएगा "एक datetime डेटा प्रकार के एक varchar डेटा प्रकार के रूपांतरण एक बाहर के रेंज मूल्य में हुई।"

एक टिप्पणीकर्ता ने पूछा कि मैंने मिलीसेकंड के लिए 997 का उपयोग क्यों किया है, यह SQL Server 2008 and milliseconds के तहत कवर किया गया है लेकिन आपको एक क्लिक सहेज रहा है, 997 सबसे बड़ा मूल्य है जिसे आप डेटाटाइम डेटाटाइप में स्टोर कर सकते हैं। 998 000 मिलीसेकेंड

/// <summary> 
    /// An initial pass at a method to verify whether a value is 
    /// kosher for SQL Server datetime 
    /// </summary> 
    /// <param name="someval">A date string that may parse</param> 
    /// <returns>true if the parameter is valid for SQL Sever datetime</returns> 
    static bool IsValidSqlDatetime(string someval) 
    { 
     bool valid = false; 
     DateTime testDate = DateTime.MinValue; 
     DateTime minDateTime = DateTime.MaxValue; 
     DateTime maxDateTime = DateTime.MinValue; 

     minDateTime = new DateTime(1753, 1, 1); 
     maxDateTime = new DateTime(9999, 12, 31, 23, 59, 59, 997); 

     if (DateTime.TryParse(someval, out testDate)) 
     { 
      if (testDate >= minDateTime && testDate <= maxDateTime) 
      { 
       valid = true; 
      } 
     } 

     return valid; 
    } 

यह शायद एक बेहतर दृष्टिकोण के रूप में यह एक वास्तविक एसक्यूएल datetime डेटा प्रकार


/// <summary> 
    /// An better method to verify whether a value is 
    /// kosher for SQL Server datetime. This uses the native library 
    /// for checking range values 
    /// </summary> 
    /// <param name="someval">A date string that may parse</param> 
    /// <returns>true if the parameter is valid for SQL Sever datetime</returns> 
    static bool IsValidSqlDateTimeNative(string someval) 
    { 
     bool valid = false; 
     DateTime testDate = DateTime.MinValue; 
     System.Data.SqlTypes.SqlDateTime sdt; 
     if (DateTime.TryParse(someval, out testDate)) 
     { 
      try 
      { 
       // take advantage of the native conversion 
       sdt = new System.Data.SqlTypes.SqlDateTime(testDate); 
       valid = true; 
      } 
      catch (System.Data.SqlTypes.SqlTypeException ex) 
      { 

       // no need to do anything, this is the expected out of range error 
      } 
     } 

     return valid; 
    } 
+0

हाँ, आप सही हैं। मैं यह सुनिश्चित करने के लिए एक समाधान की तलाश में हूं कि मेरे पास डेटटाइम के रूप में स्ट्रिंग अब किसी भी त्रुटि के बिना तालिका में डेटाटाइम फ़ील्ड में डाली जाएगी। – MichaelVerossa

+0

एक साधारण विधि जोड़ने के लिए संपादित किया गया है जो मानों की जांच करेगा। एक दूसरे दृष्टिकोण की कोशिश करने के लिए जा रहा है, कम त्रुटि प्रवण – billinkc

+0

हो सकता है मैं आपकी विधि का प्रयास करूंगा! धन्यवाद, बिलिंकक! – MichaelVerossa

1

आप अपने दिनांक समय क्षेत्र के सर्वर साइड सत्यापन के बारे में उल्लेख कर रहे हैं, DateTime.TryParse का उपयोग करें। एक त्वरित और गंदे उदाहरण हो जाएगा

DateTime dateValue; 
string dateString = "05/01/2009 14:57:32.8"; 
if (DateTime.TryParse(dateString, out dateValue)) 
{ 
    // valid date comes here. 
    // use dateValue for this 
} 
else 
{ 
    // valid date comes here 
} 
1

DateTime.TryParse सबसे अच्छा सत्यापनकर्ता

DateTime temp; 
if(DateTime.TryParse(txtDate.Text, out temp)) 
//Works 
else 
// Doesnt work 
+0

इस मामले में नहीं। प्रत्येक SQLDatetime एक वैध .NET डेटाटाइम है लेकिन दूसरी तरफ नहीं। – bjoern

1

तुम कहाँ datetime मूल्य से आ रहा है पर अधिक जानकारी के bt एक प्रदान कर सके है; एक वेब फॉर्म? आप बस एक CompareValidator रूप

<asp:CompareValidator ID="CompareValidator1" runat="server" 
      ControlToValidate="txtDate" 
      Type="Date" 
      ErrorMessage="CompareValidator"> 
</asp:CompareValidator> 
+0

<एएसपी: तुलना वैलिडेटर आईडी = "तुलना वैलिडेटर 1" रनैट = "सर्वर" कंट्रोल टॉ वैलिडेट = "txtDate" टाइप = "डेट" त्रुटि संदेश = "तुलना वैलिडेटर">

+0

http://stackoverflow.com/editing-help – naveen

+1

धन्यवाद नवीन, सिरदर्द का थोड़ा सा साबित कर रहा था :) –

1

आप SQLInjection

को रोकने के लिए examplae लिए Parametter साथ SqlCommand उपयोग कर सकते हैं इस प्रकार जोड़ सकते हैं:

SqlCommand cmn = new SqlCommand("UPDATE table SET date = @Date "); 
// cmn set Here.... 
cmn.Parameters.Add("@Date",SqlDbType.DateTime).Value = dateTimeObj; 

और दूसरी (रों), आप MSDN में देख सकते हैं

2

में दिनांक समय वस्तु डाली करने का प्रयास करेंगे है के साथ 1 सेकंड में पूर्णांकित कर दिया जाएगा बिलिंक के जवाब पर यह एक और लेना है। हालांकि, इस विधि में। न्यूनतम/अधिकतम की वैल्यू प्रॉपर्टी का उपयोग पार्सिंग और कोशिश/पकड़ने से बचने के लिए किया जाता है। किसी ने उल्लेख किया है कि वे यह सुनिश्चित करना चाहते हैं कि वे SQL सर्वर में मान्य दिनांक डालें। इसलिए, मैंने SQL सर्वर के लिए मान्य दिनांक को वापस करने का दृष्टिकोण लिया। इसे आसानी से एक बूलियन विधि में बदला जा सकता है जो यह देखने के लिए जांचता है कि दिनांक ToVerify मान्य SQL सर्वर दिनांक है या नहीं।

protected DateTime EnsureValidDatabaseDate(DateTime dateToVerify) 
{ 
    if (dateToVerify < System.Data.SqlTypes.SqlDateTime.MinValue.**Value**) 
    { 
     return System.Data.SqlTypes.SqlDateTime.MinValue.Value; 
    } 
    else if (dateToVerify > System.Data.SqlTypes.SqlDateTime.MaxValue.**Value**) 
    { 
     return System.Data.SqlTypes.SqlDateTime.MaxValue.Value; 
    } 
    else 
    { 
     return dateToVerify; 
    } 
} 
12

एसक्यूएल dateTime मूल्य हार्डकोड के बिना इस प्रयास करें:

public bool IsValidSqlDateTime(DateTime? dateTime) 
    { 
     if (dateTime == null) return true; 

     DateTime minValue = DateTime.Parse(System.Data.SqlTypes.SqlDateTime.MinValue.ToString()); 
     DateTime maxValue = DateTime.Parse(System.Data.SqlTypes.SqlDateTime.MaxValue.ToString()); 

     if (minValue > dateTime.Value || maxValue < dateTime.Value) 
      return false; 

     return true; 
    } 
+1

आप SqlDateTime संरचना पर परिभाषित स्पष्ट कास्टिंग ऑपरेटर का भी उपयोग कर सकते हैं; स्ट्रिंग प्रस्तुति को पार्स करने के बजाय: 'var minValue = (dateTime) System.Data.SqlTypes.SqlDateTime.MinValue; ' – Styxxy

2
<asp:RangeValidator runat="server" ID="rgvalDate" ControlToValidate="txtDate" Text="[Invalid]" Type="Date" MinimumValue="1/1/1753" MaximumValue="12/31/9999" /> 

या

कस्टम सत्यापनकर्ता:

protected void cvalDOB_ServerValidate(object sender, ServerValidateEventArgs e) 
    { 
     e.IsValid = IsValidSqlDateTime(e.Value); 
    } 

    public static bool IsValidSqlDateTime(object Date) 
    { 
     try 
     { 
      System.Data.SqlTypes.SqlDateTime.Parse(Date.ToString()); 
      return true; 
     } 
     catch 
     { 
      return false; 
     } 
    } 
संबंधित मुद्दे