PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

SQL कमांड में C वैरिएबल पास करना

इसे संभालने के दो तरीके हैं। सबसे पहले इसमें डाले गए मानों के साथ स्ट्रिंग तैयार करना है। दूसरा क्वेरी पैरामीटर का उपयोग करना है जिसके लिए आप मानों को अलग से स्थानापन्न कर सकते हैं।

पहली विधि के लिए, आप snprintf जैसे फ़ंक्शन का उपयोग कर सकते हैं कमांड तैयार करने के लिए आप सर्वर को भेजेंगे। उदाहरण के लिए:

char buffer[512];

int num=snprintf(buffer, sizeof(buffer), 
    "SELECT name FROM MYTABLE WHERE id=%d", id);

if (num>sizeof(buffer)) {
    /* error: buffer was too small */
}

इसके बाद बफ़र में वैरिएबल आईडी के वास्तविक मान सहित SQL क्वेरी होगी।

यह देखने के लिए कि बफर ओवरफ्लो हुआ है या नहीं, snprintf से वापसी मूल्य की जांच करने की आवश्यकता पर ध्यान दें।

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

दूसरी विधि, जो ज्यादातर मामलों में बेहतर होती है, SQL कमांड और पैरामीटर को सर्वर पर अलग से पास करना है। उदाहरण के लिए, आप PQexecParams का उपयोग करके ऐसा कर सकते हैं। libpq functoin. आपकी SQL स्ट्रिंग इस तरह दिखेगी:

PGresult r = PQexecParams(conn, /* Connection to database */
    "SELECT name FROM mytable WHERE id=$1",
    1,             /* Number of parameters */
    NULL,          /* NULL means server should figure out the parameter types */
    params,        /* Pointer to array of strings containing parameters */
    NULL,          /* Not needed unless binary format used */
    NULL,          /* Not needed unless binary format used */
    0              /* Result to come back in text format */
);

यह फ़ंक्शन आपको पैरामीटर प्रदान करने और/या पाठ या बाइनरी प्रारूप में परिणाम प्राप्त करने की अनुमति देता है। सरलता के लिए ऊपर दिया गया मेरा उदाहरण दोनों के लिए टेक्स्ट प्रारूप मानता है।

इस पर एक बदलाव तैयार बयानों का उपयोग करना है। इस मामले में, आप libpq को दो अलग-अलग कॉल करते हैं:

  1. PQprepare को कॉल करें, जिसमें आप ऊपर दिए गए मेरे उदाहरण के अनुसार पैरामीटर मान $1, $2, आदि के साथ अपना SQL कथन पास करते हैं। यह एक स्टेटमेंट हैंडल लौटाएगा।

  2. PQexecPrepared को कॉल करें, जिसमें आप स्टेटमेंट हैंडल पास करते हैं और पैरामीटर भी, जो PQexecParams के समान तरीके से निर्दिष्ट हैं।

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




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. कॉलम निर्दिष्ट किए बिना SQL INSERT। क्या होता है?

  2. मेरे कस्टम टेक्स्ट सर्च कॉन्फ़िगरेशन के लिए थिसॉरस डिक्शनरी को सही तरीके से कैसे बनाएं

  3. PostgreSQL में विशेष कॉलम नामों वाले कॉलम चुनें

  4. ऑर्डर बाय के साथ विभाजन में पंक्तियों की गणना करें

  5. बाल्टियों में वस्तुओं को छांटना वैध JPQL अभिव्यक्ति के रूप में कैसे तैयार किया जा सकता है?