2012-09-21 14 views
5

के साथ काम नहीं कर रहे एक्सेस 2010 डीबी के खिलाफ एसक्यूएल स्टेटमेंट मैं रिकॉर्ड्स खोजने के लिए एक्सेस डीबी के खिलाफ एक सरल कथन चलाने का प्रयास कर रहा हूं।ओडीबीसी

रिकॉर्ड में डेटा सत्यापन भयानक था, और मैं इसे स्वच्छ नहीं कर सकता। मतलब, यह संरक्षित किया जाना चाहिए।

मुझे सफेद स्थान और हाइफ़न वर्णों के साथ एक स्ट्रिंग के विरुद्ध खोजने में सक्षम होना चाहिए। निम्नलिखित कथन एक्सेस 2010 में सीधे काम करेगा:

select * from dummy where Replace(Replace([data1],' ',''),'-','') = 'ABCD1234'; 

PHP के माध्यम से ओडीबीसी कनेक्शन से इसे चलाने से नहीं होगा।

SQL error: [Microsoft][ODBC Microsoft Access Driver] Undefined function 'Replace' in expression., SQL state 37000 in SQLExecDirect 

डेटाबेस समारोह चलाता है कि में एक प्रश्न तैयार करना और उसका मान खोज करने के लिए प्रयास करने से परोक्ष रूप से एक ही त्रुटि होती है:

select * from dummy_indirect where Expr1 = 'ABCD1234'; 

मैं दोनों ODBC का उपयोग करने का प्रयास किया यह निम्न त्रुटि पैदा करता है ड्राइवर मौजूद हैं। ODBCJR32.dll (03/22/2010) और ACEODBC.dll (02/18/2007)। मेरे ज्ञान के लिए ये वर्तमान होना चाहिए क्योंकि इसे पूर्ण एक्सेस 2010 और एक्सेस 2010 डेटाबेस इंजन के साथ स्थापित किया गया था।

इस त्रुटि के आसपास काम करने और समान प्रभाव प्राप्त करने के बारे में कोई भी विचार स्वागत है। कृपया ध्यान दें, कि मैं डेटाबेस, तरीके, या रूप में परिवर्तित नहीं कर सकता। वह अप्रत्यक्ष क्वेरी किसी अन्य एमडीबी फ़ाइल में बनाई गई थी जिसमें मूल डीबी से जुड़ी मूल सारणीयां थीं।

* अद्यतन *

OLEDB वास्तव में कुछ प्रभावित नहीं किया।

$dsn= "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\dummy.mdb;"; 

मैं इसे वेब बैकएंड के रूप में उपयोग करने का प्रयास नहीं कर रहा हूं। मैं एक दुखद नहीं हूँ।

एक विरासत प्रणाली है जिसे मुझे का समर्थन करना चाहिए बैकएंड के रूप में उपयोग का उपयोग करें। अन्य पुरानी प्रणालियों से डेटा पॉप्युलेट हो जाता है जिसे मुझे अधिक आधुनिक प्रणालियों में एकीकृत करना होगा। इसलिए, विरासत प्रणाली का समर्थन करने वाले सर्वर पर चल रहे अपाचे/PHP के साथ एक एपीआई का निर्माण।

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

यदि प्रतिस्थापित नहीं किया गया है() जो समर्थित है, ओडीबीसी संगत कार्य क्या मौजूद हैं जो मैं समान प्रकार की तुलना कर सकता हूं?

+0

एक्सेस डीबी इंजन सभी एप्लिकेशन संदर्भों में कार्यों के मानक सेट का समर्थन करता है। अन्य कार्य, जैसे 'Replace()', और उपयोगकर्ता द्वारा परिभाषित फ़ंक्शंस, जैसे कि आपकी 'dummy_indirect() ', केवल एक्सेस एप्लिकेशन इंस्टेंस के भीतर से समर्थित हैं। जब आप अपने डीबी तक पहुंचने के लिए ओडीबीसी का उपयोग करते हैं, तो एक्सेस स्वयं नहीं चल रहा है ... तो वे फ़ंक्शंस उपलब्ध नहीं हैं। – HansUp

+0

dummy_indirect एक क्वेरी है। ओडीबीसी द्वारा कौन से फ़ंक्शंस समर्थित हैं? कहीं भी सूची ढूंढना बहुत मुश्किल है। क्या कुछ जगह बदलने के समान है? – user1441141

+0

क्षमा करें मुझे dummy_indirect के बारे में उलझन में आया। हालांकि, अगर यह एक और प्रश्न है जो 'प्रतिस्थापन() 'का उपयोग करता है, डीबी इंजन अभी भी उस फ़ंक्शन को तब तक पहचान नहीं पाएगा जब तक यह किसी एसी के भीतर से नहीं चलता है सेस आवेदन उदाहरण। – HansUp

उत्तर

-2

मुझे यकीन नहीं है कि आप ओडीबीसी और अपनी बाधाओं के साथ ऐसा कर सकते हैं। MS Access driver is limited (डिज़ाइन द्वारा; एमएस चाहता है कि आप बैक सिरों के लिए SQL सर्वर का उपयोग करें)।

क्या आप ओएलईडीबी का उपयोग कर सकते हैं? यह एक विकल्प हो सकता है।

+1

आप ओलेडीबी के साथ समस्या से बच नहीं सकते हैं। यह डेटाबेस इंजन की एक सीमा है ... कनेक्शन विधि कोई फर्क नहीं पड़ता। वह केवल उन कार्यों का उपयोग करके वास्तविक एक्सेस एप्लिकेशन सत्र में क्वेरी चला सकता है। – HansUp

+2

"डिज़ाइन द्वारा; एमएस चाहता है कि आप बैक सिरों के लिए SQL सर्वर का उपयोग करें" मुझे इसमें बहुत संदेह है। एसक्यूएल सर्वर बहुत छोटे उपयोगकर्ता के लिए पूरी तरह से अनुपयुक्त है, एक के लिए। – Fionnuala

+0

मेरा मतलब है "उन्नत" सामान जैसे वेब बैक एंड के रूप में इसका उपयोग करना। एमएस में एक एक्सेस देव ने मुझे बताया, वैसे भी। मुद्दा यह है, "इस पर एमएस से समर्थन की एक टन की उम्मीद नहीं है" –

4

बस रिकैक करने के लिए, एक्सेस डीबी इंजन Replace() फ़ंक्शन को तब तक पहचान नहीं पाएगा जब तक आपकी क्वेरी किसी एक्सेस एप्लिकेशन सत्र में नहीं चलती। बाहरी एक्सेस से कोई भी प्रयास उस "अपरिभाषित फ़ंक्शन" त्रुटि संदेश को ट्रिगर करेगा। आप ओडीबीसी से ओलेडीबी से कनेक्शन विधि के रूप में स्विच करके त्रुटि से बच नहीं सकते हैं।और आप अलग-अलग क्वेरी (उसी या किसी अन्य एक्सेस डीबी में) छिपकर Replace() का उपयोग करके इंजन को ट्रिक नहीं कर सकते हैं और उस क्वेरी का उपयोग अपनी मुख्य क्वेरी के डेटा स्रोत के रूप में कर सकते हैं।

यह व्यवहार Access' sandbox mode द्वारा निर्धारित किया गया है। उस लिंक किए गए पृष्ठ में फ़ंक्शंस की एक सूची शामिल है जो डिफ़ॉल्ट सैंडबॉक्स मोड में उपलब्ध हैं। वह पृष्ठ यह भी वर्णन करता है कि आप सैंडबॉक्स मोड को कैसे बदल सकते हैं। यदि आपके पास पूरी तरह से Replace() आपकी क्वेरी के लिए उपलब्ध होना चाहिए, तो शायद निम्नतम सेटिंग (0) इसे अनुमति देगी। हालांकि, मैं आपको ऐसा करने की सिफारिश नहीं कर रहा हूं। मैंने इसे कभी नहीं किया है, इसलिए परिणामों के बारे में कुछ भी नहीं पता।

Replace() के विकल्प के लिए, यह आपके द्वारा खोजे जा रहे मूल्यों में परिवर्तनशीलता के बारे में जानने में मदद करेगा। यदि स्थान या डैश वर्ण केवल एक या कुछ सुसंगत स्थितियों में दिखाई देते हैं, तो आप Like अभिव्यक्ति के साथ एक पैटर्न मिलान कर सकते हैं। उदाहरण के लिए, यदि खोज फ़ील्ड मान 4 पत्र, अतिरिक्त स्थान या पानी का छींटा, 4 अंक के बाद से मिलकर बनता है, एक WHERE खंड इस तरह "abcd1234" का उपयोग के रूपांतरों के लिए काम करना चाहिए:

SELECT * FROM dummy 
WHERE 
     data1 = 'ABCD1234' 
    OR data1 Like 'ABCD[- ]1234'; 

एक और संभावना है मानों की सूची के खिलाफ तुलना:

SELECT * FROM dummy 
WHERE 
     data1 IN ('ABCD1234','ABCD 1234','ABCD-1234'); 

हालांकि अपनी खोज फ़ील्ड मान स्ट्रिंग भीतर किसी भी स्थिति में स्थान या डैश के किसी भी संख्या में शामिल कर सकते हैं, कि दृष्टिकोण अच्छा नहीं है। और मैं असली मुश्किल किसी तरह क्वेरी काम आसान बनाने के लिए के लिए दिखेगा:

  1. आप संग्रहीत मूल्यों को साफ नहीं कर सकते क्योंकि आप किसी भी तरह से मूल एक्सेस डाटाबेस में फेरबदल करने से मना कर रहे हैं। शायद आप एक नया एक्सेस डीबी बना सकते हैं, डेटा आयात कर सकते हैं, और इसके बजाए इसे साफ़ कर सकते हैं।
  2. SQL सर्वर में एक लिंक किए गए सर्वर के रूप में मूल एक्सेस डीबी सेट करें और SQL सर्वर सुविधाओं का लाभ उठाने के लिए अपनी क्वेरी बनाएं।
  3. समर्पण। :-(अपने PHP क्लाइंट कोड पर एक बड़े डेटा सेट में खींचें, और मूल्यांकन करें कि कौन सी पंक्तियां बनाम उपयोग करने के लिए बनाम हैं।
+0

Arrrgh। सूची के लिए धन्यवाद। मैं सैंडबॉक्स 0 को आजमा सकता हूं और देख सकता हूं कि यह मुझे प्रतिस्थापन फ़ंक्शन देता है या नहीं। अन्य सुझावों के लिए, 1) डीबी विरासत प्रणाली के साथ नया डेटा बना रहा है। 2) देखें 1. 3) स्मार्ट शर्त की तरह अधिक से अधिक लगता है ..... :( – user1441141

+0

आपकी स्थिति रॉक और कड़ी जगह के बीच फंस गई जैसी बहुत ज्यादा लगता है। आपको मेरी सहानुभूति है ... सभी अच्छे कामों के लिए तुम जैसे मैंने कहा, मैंने कभी सैंडबॉक्स सेटिंग्स के साथ झुकाया नहीं है। वह संभावना मुझे चिंतित करती है।अगर यह किसी भी तरह से उड़ाता है तो कृपया मुझे दोष न दें। ;) इसके साथ शुभकामनाएँ। – HansUp

+0

मूल्यों में परिवर्तनशीलता चरम है। मामले पहचानकर्ताओं के लिए 23 विभिन्न पैटर्न। तेईस। कई पैटर्न, और भगवान जानता है कि क्यों, वे कैसे संग्रहीत किए जाते हैं (फ़ोन नंबरों की तरह) के अलग-अलग डिस्प्ले पैटर्न हैं, और इसे सीधे स्वचालित बनाम स्वचालित प्रविष्टियों को संग्रहीत करते समय कोई इनपुट सत्यापन नहीं था। तो डिस्प्ले से फ़ील्ड में कॉपी किए गए मान और संग्रहीत स्वचालित प्रविष्टियों से अलग हैं। कभी-कभी एक हाइफ़न की बजाय 0 वर्ण का उपयोग किया जाता है। अभी भी एक बाहर लग रहा है। हाँ ....... सब कुछ नीचे अल्फ्नम को अलग करना मेरा एकमात्र मौका था और इसे टारपीडो किया गया था। – user1441141

संबंधित मुद्दे