2008-10-14 11 views
17

मैं कुछ इस तरह के साथ VBA में एक डोमेन देखने करने के लिए कोशिश कर रहा हूँ:Access में पलायन 'एसक्यूएल

DLookup("island", "villages", "village = '" & txtVillage & "'") 

यह ठीक काम करता है जब तक txtVillage डिलन बे, जब apostrophe एक होने के लिए लिया जाता है की तरह कुछ है एकल उद्धरण, और मुझे रन-टाइम त्रुटि मिलती है।

मैंने एक छोटा सा फ़ंक्शन लिखा है जो सिंगल कोट्स से बच निकलता है - यह "'" को "'" से बदलता है। ऐसा लगता है कि काफी बार आता है, लेकिन मुझे एक अंतर्निहित फ़ंक्शन का कोई संदर्भ नहीं मिल रहा है जो वही करता है। क्या मुझे कुछ याद आया है?

उत्तर

15

"बदलें" समारोह चाल करना चाहिए। मेरा मानना ​​है कि

DLookup("island", "villages", "village = '" & Replace(txtVillage, "'", "''") & "'") 
+0

है कि मैं वास्तव में क्या देख रहा हूँ - बहुत बहुत शुक्रिया – inglesp

+1

ध्यान दें कि बदलें() पहुँच के पुराने संस्करणों में मौजूद नहीं लगता है (यानी एक्सेस 97।)। – apenwarr

+0

बदलें() पहुँच 2000 –

3

यह आपके विचार से भी बदतर है। अगर किसी को इस तरह एक मूल्य में प्रवेश किया तो क्या होगा के बारे में सोचो, और आप कुछ भी बच गए नहीं किया है:

'); DROP TABLE [YourTable] 

सुंदर नहीं।

एक एस्ट्रोफ़े से बचने के लिए फ़ंक्शन में कोई भी अंतर्निहित कारण नहीं है क्योंकि इसे संभालने का सही तरीका क्वेरी पैरामीटर का उपयोग करना है। ओले/एक्सेस स्टाइल क्वेरी के लिए आप इसे अपनी क्वेरी स्ट्रिंग के रूप में सेट करेंगे:

DLookup("island", "village", "village = ? ") 

और फिर पैरामीटर को अलग से सेट करें। मुझे नहीं पता कि आप vba से पैरामीटर मान को सेट करने के बारे में कैसे जाते हैं, हालांकि।

+0

वास्तव में किस प्रकार आप paremeter अलग से सेट करूँ? – StockB

+0

तैयार बयान का प्रयोग करें। Http://stackoverflow.com/questions/6572448/msaccess-prepared-statements या http://technet.microsoft.com/en-us/library/aa905910(v=sql.80).aspx देखें। यह आलेख SQL सर्वर के बारे में है, लेकिन मुझे संदेह है कि यह एक्सेस के लिए भी काम कर सकता है। –

0

वैसे, यहाँ मेरी EscapeQuotes ढंग से काम

Public Function EscapeQuotes(s As String) As String 

    If s = "" Then 
     EscapeQuotes = "" 
    ElseIf Left(s, 1) = "'" Then 
     EscapeQuotes = "''" & EscapeQuotes(Mid(s, 2)) 
    Else 
     EscapeQuotes = Left(s, 1) & EscapeQuotes(Mid(s, 2)) 
    End If 

End Function 
+0

इसमें क्या गड़बड़ है: EscapeQuotes = बदलें (एस, "'", "' '")? –

+0

यही वह है जो मैं वास्तव में पूछ रहा था। मैं वीबीए का अधिक उपयोग नहीं करता, और मुझे सहायता फाइलें बहुत उपयोगी नहीं मिलती हैं! चीयर्स। – inglesp

1

पहुँच Chr $ (34) का उपयोग कर सकते हैं और खुशी से एकल उद्धरण/अक्षर लोप के अंदर है: ऊपर अपने कोड के आधार पर।
जैसे

DLookup("island", "villages", "village = " & chr$(34) & nonEscapedString & chr$(34)) 

तो आप chr $ (34) से बचने के लिए होगा हालांकि (")

आप उपयोग कर सकते हैं समारोह बदलें।

Dim escapedString as String 

escapedString = Replace(nonescapedString, "'", "''") 
3

हालांकि आशुलिपि डोमेन कार्यों जैसे कि डीएलकेप आकर्षक हैं, उनके पास नुकसान हैं। समकक्ष जेट एसक्यूएल

SELECT FIRST(island) 
FROM villages 
WHERE village = ?; 
जैसा कुछ है

यदि आपके पास एक से अधिक मिलान करने वाले उम्मीदवार हैं तो यह 'पहला' चुनेंगे, 'प्रथम' की परिभाषा कार्यान्वयन (एसक्यूएल इंजन) निर्भर है और जेट/एसीई इंजन आईआईआरसी के लिए अपरिभाषित है। क्या आप जानते हैं कि कौन सा पहला होगा? यदि आप DLookup को साफ़ नहीं करते हैं :)

[रुचि के लिए, जेट/एसीई के लिए उत्तर क्लस्टर इंडेक्स के आधार पर न्यूनतम मान होगा जब डेटाबेस फ़ाइल आखिरी बार कॉम्पैक्ट की गई थी या पहली (मान्य समय) यदि डेटाबेस कभी संकलित नहीं किया गया है तो सम्मिलित मूल्य। क्लस्टर्ड इंडेक्स बदले में प्राइमरी कुंजी द्वारा निर्धारित किया जाता है यदि अन्यथा गैर-कॉलम पर परिभाषित एक विशिष्ट बाधा या सूचकांक, अन्यथा पहली (वैध समय) पंक्ति डाली गई है। क्या होगा यदि नल कॉलम पर परिभाषित एक से अधिक अद्वितीय बाधा या अनुक्रमणिका है, जिसे क्लस्टरिंग के लिए उपयोग किया जाएगा? मुझे पता नहीं है! मुझे भरोसा है कि आपको यह विचार मिलता है कि 'पहला' निर्धारित करना आसान नहीं है, भले ही आप कैसे जानते हों!]

मैं भी Microsoft से सलाह देखा है देखने का एक अनुकूलन बिंदु से डोमेन कुल कार्यों का उपयोग कर से बचने के लिए:

एक एक्सेस डेटाबेस http://support.microsoft.com/kb/209126

में क्वेरी प्रदर्शन के बारे में जानकारी "डोमेन कुल कार्यों के उपयोग से बचें एक प्रश्न का उपयोग कर आप तो पैरामीटर वाक्य रचना का लाभ ले सकते लिखने कर रहे हैं, इस तरह के DLookup समारोह के रूप में ... जेट डेटाबेस इंजन प्रश्नों कि डोमेन कुल कार्यों "

का उपयोग आप के लिए चुनते हैं अनुकूलित नहीं कर सकते हैं, या आप पसंद कर सकते हैं जी टी 4.0/एसीई प्रक्रिया वाक्यविन्यास उदा। जैसे

CREATE PROCEDURE GetUniqueIslandName 
(
    :village_name VARCHAR(60) 
) 
AS 
SELECT V1.island_name 
    FROM Villages AS V1 
WHERE V1.village_name = :village_name 
     AND EXISTS 
     (
     SELECT V2.village_name 
      FROM Villages AS V2 
     WHERE V2.village_name = V1.village_name 
     GROUP 
      BY V2.village_name 
     HAVING COUNT(*) = 1 
     ); 

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

0

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

0

जो एकल उद्धरण साथ परेशानी हो रही है और समारोह की जगह के लिए, इस लाइन के लिए अपने दिन

Replace(result, "'", "''", , , vbBinaryCompare) 
0

डाल कोष्ठक मापदंड उस में एपोस्ट्रोफ़ी हो सकता है चारों ओर सहेज सकते हैं^ओ ^।

कुछ की तरह:

DLookup("island", "villages", "village = '" & [txtVillage] & "'") 

लेकिन अगर आप सही संयोजन मिल जाए, यह ध्यान रखना होगा:

DLookup("island", "villages", "village = '[" & txtVillage & "]'") 

वे की तरह txtVillage एकल उद्धरण के बाहर या बस के आसपास होने की आवश्यकता हो सकती है apostrophe।

कीथ बी

-1

मेरा समाधान बहुत आसान है।

Dim sSQL as String 
sSQL="SELECT * FROM tblTranslation WHERE fldEnglish='" & myString & "';" 

जब myString उस में एपोस्ट्रोफ़ी था, Int'l Electrics की तरह, मेरे कार्यक्रम को रोकने जाएगा: मूल रूप से, मैं कोई ADO recordset बनाने के लिए इस एसक्यूएल अभिव्यक्ति का इस्तेमाल किया। डबल कोट्स का उपयोग करने से समस्या हल हो गई।

sSQL="SELECT * FROM tblTranslation WHERE fldEnglish="" & myString & "";" 
+1

हाँ, इसलिए एक एस्ट्रोफ़े-समस्या के बजाय अब आपके पास दोहरे उद्धरण-समस्या है: - / –

1

लेकिन फिर भी, यह (एक और doublequote प्रत्येक के साथ) इस तरह होना चाहिए:

sSQL = "SELECT * FROM tblTranslation WHERE fldEnglish=""" & myString & """;" 

या मैं क्या पसंद करते हैं:

एकल उद्धरण से बचने के लिए एक समारोह है, क्योंकि "भागने "साथ" [] "इन वर्णों को आपकी स्ट्रिंग में अनुमति नहीं देगा ...

Public Function fncSQLStr(varStr As Variant) As String 

If IsNull(varStr) Then 
     fncSQLStr = "" 
    Else 
     fncSQLStr = Replace(Trim(varStr), "'", "''") 
    End If 

End Function 

मैं इस फ़ंक्शन का उपयोग करता हूं मेरे सभी एसक्यूएल-प्रश्नों के लिए, जैसे चयन, INSERT और अद्यतन (और जहां भी खंड में ...)

strSQL = "INSERT INTO tbl" & 
    " (fld1, fld2)" & _ 
    " VALUES ('" & fncSQLStr(str1) & "', '" & fncSQLStr(Me.tfFld2.Value) & "');" 

या

strSQL = "UPDATE tbl" & _ 
    " SET fld1='" & fncSQLStr(str1) & "', fld2='" & fncSQLStr(Me.tfFld2.Value) & "'" & _ 
    " WHERE fld3='" & fncSQLStr(str3) & "';" 
संबंधित मुद्दे