2009-10-16 12 views
5

मैं सी # का उपयोग कर एमएस एक्सेस से डेटा पढ़/अपडेट करता हूं। मेरे कोड है:मानदंड अभिव्यक्ति में डेटा प्रकार मेल नहीं खाता | एक्सेस, ओलेडीबी, सी #

public static void UpdateLastLogin(int userid, DateTime logintime) ///logintime = DateTime.Now 
{ 
    string sql = @"UPDATE [Customers] SET [LastLogin]=?"; 
    OleDbParameter[] prms = new OleDbParameter[] { 
    new OleDbParameter("@LastLogin",logintime) 
    }; 
    using (DAL dal = new DAL()) 
    { 
     dal.UpdateRow(sql, false, prms); 
    } 
} 

यह तिथियां की बात आती है, मैं परेशानी हो रही। यह "मानदंड अभिव्यक्ति में डेटा प्रकार विसंगति" फेंकता है। त्रुटि। (मैंने इसे आसान रखने के लिए WHERE क्लॉज को हटा दिया) क्या मैं [LastLogin] = संलग्न करने के लिए तैयार हूं? सिंगल कोट्स के साथ प्रश्न चिह्न, # संकेत .. मदद नहीं करता है। एक्सेस और ओलेडीबी प्रदाता के साथ डेटटाइम ऑब्जेक्ट्स को संभालने के तरीके पर कोई भी लीड की सराहना की जाएगी।

अग्रिम धन्यवाद।

+0

कोड बिट पढ़ने के लिए आसान होगा हल किया। यदि आप इसे 4 रिक्त स्थान –

उत्तर

0

सबसे पहले, कोई अपने SQL विवरण होना चाहिए:

"UPDATE Customers SET [email protected]" 

दूसरे, कारण आप प्राप्त कर रहे तिथि मेल नहीं खाती त्रुटि शायद अपनी गुजर हो जाएगा '?' वास्तविक लॉग इनटाइम पैरामीटर की बजाय LastLogin फ़ील्ड में आपकी तिथि का समय।

+0

इंडेंट करके कोड के रूप में प्रारूपित करते हैं लेकिन यह एक्सेस है .. मैंने सोचा कि ओलेडीबी नामित पैरामीटर का समर्थन नहीं करता है :( – emre

+0

उपरोक्त कथन यह मानना ​​चाहिए कि आप ओलेडबॉमंड – James

0

शायद

DateTime.Now.ToShortDateString() + ' ' + DateTime.Now.ToShortTimeString() 

बजाय कोशिश, स्ट्रिंग के रूप में इसे पारित (और शायद तब # साथ जोड़ देना)

+1

का उपयोग कर रहे हैं .. लेकिन फिर वे दिखाते हैं केवल दिनांक नहीं समय :) – emre

+0

शायद डेटटाइम के ToString() को पास की गई एक प्रारूप स्ट्रिंग – emre

+0

मेरी पोस्ट संपादित करने में मदद करेगी ... काम करना चाहिए। ऐसा करने के लिए शायद अधिक सुरुचिपूर्ण तरीके हो सकते हैं, क्योंकि यह संभवतः आपके स्थानीयकरण विकल्पों पर निर्भर हो सकता है ... –

0

यह

"UPDATE Customers SET LastLogin='@LastLogin'" 

नहीं होना चाहिए और @LastLogin होना चाहिए

logintime.ToString("yyyy-MM-dd hh:mm:ss") 

संपादित करें क्या आप पूरी चीज को केवल इनलाइन नहीं कर सकते?

"UPDATE Customers SET LastLogin='" + logintime.ToString("yyyy-MM-dd hh:mm:ss") + "'" 
+0

आप पूरी चीज को रेखांकित कर सकते हैं, हां, लेकिन गतिशील एसक्यूएल बनाना एक बुरी आदत है। पैरामीटर का उपयोग करना बेहतर डिज़ाइन और पढ़ने के लिए आसान है। –

0

एक तिथि, दिनांक या datetime2 के रूप में उपयुक्त के रूप में पहचान करने के लिए पैरामीटर का "DBTYPE" संपत्ति की स्थापना का प्रयास करें ...

prms[0].DbType = DbType.DateTime; 

नई OleDbParameter 7 हस्ताक्षर कर रहे हैं() कॉल , इसलिए आप हस्ताक्षर उदाहरण बदल सकते हैं, या बस स्पष्ट रूप से करें जैसा कि मैंने उपरोक्त नमूना दिया है क्योंकि इस मामले में आपके पास केवल 1 पैरामीटर था।

4

ओलेडीबी और तिथियों के साथ एक ज्ञात समस्या है। की तरह कुछ कर रही प्रयास करें:

OleDbParameter p = parameter as OleDbParameter; 
if (null == p) 
    parameter.DbType = DbType.DateTime; 
else 
    p.OleDbType = OleDbType.Date; 

या का उपयोग स्पष्ट प्रारूप स्ट्रिंग:

value.ToString("yyyy-MM-dd hh:mm:ss") 
1

मैं इस का उपयोग करते हुए निम्न कोड

OleDbCommand cmd = new OleDbCommand(qry, cnn); 
cmd.Parameters.Add("datenow", OleDbType.Date); 
cmd.Parameters["datenow"].Value = DateTime.Now; 
संबंधित मुद्दे