2009-02-20 19 views
20

मैं समझता हूं कि पोस्टग्रेस शुद्ध में, आप फ़ंक्शन में एक पूर्णांक सरणी पास कर सकते हैं लेकिन यह .NET डेटा प्रदाता Npgsql में समर्थित नहीं है।पोस्टग्रेज़ पूर्णांक सरणी पैरामीटर के रूप में?

मेरे पास वर्तमान में एक डीबीकॉमैंड है जिसमें मैं एक संग्रहित प्रो में कॉल लोड करता हूं, पैरामीटर में जोड़ता हूं और ऑब्जेक्ट को पॉप्युलेट करने के लिए आईडी को वापस पाने के लिए स्केलर निष्पादित करता हूं।

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

आदर्श रूप से मुझे प्रत्येक पूर्णांक के लिए मेरे डीबीकॉमैंड पर एकाधिक निष्पादनऑनक्वियर कॉल नहीं करना पड़ेगा, इसलिए मैं एक पैरामीटर के रूप में एक सीएसवी स्ट्रिंग बनाने जा रहा हूं जो डेटाबेस पक्ष पर विभाजित होगा।

मैं सामान्य रूप से LINQ 2 एसक्यूएल में डीबी अबास्ट्रक्शन का स्वाद लेता हूं, इस परियोजना पर मैन्युअल डेटा एक्सेस के साथ काम कर रहा हूं, यह सब कुछ गंदा हो रहा है, लोग आमतौर पर पोस्टग्रेज़ में इन प्रकार के पैरामीटर को पार करने के बारे में कैसे जाते हैं?

+3

उन लोगों के लिए हो चयनित उत्तरों के पीछे नहीं पढ़ा: ऐरे पैरामीटर * .NET Npgsql प्रदाता के साथ समर्थित हैं (हालांकि मैं यह नहीं कह सकता कि प्रश्न पूछने पर यह सच था या नहीं)। मेरा [नीचे जवाब] देखें (http://stackoverflow.com/a/7733714/957950)। – brichins

उत्तर

36

देखें: http://www.postgresql.org/docs/9.1/static/arrays.html

अपने गैर देशी चालक अभी भी आप सरणियों गुजरने की अनुमति नहीं है, तो आप कर सकते हैं:

  • एक सरणी के एक स्ट्रिंग प्रतिनिधित्व (पारित जो अपने संग्रहीत प्रक्रिया कर सकते हैं तो एक सरणी में पार्स - string_to_array देख)

    CREATE FUNCTION my_method(TEXT) RETURNS VOID AS $$ 
    DECLARE 
         ids INT[]; 
    BEGIN 
         ids = string_to_array($1,','); 
         ... 
    END $$ LANGUAGE plpgsql; 
    
    तो

    SELECT my_method(:1) 
    
    साथ

    : 1 = '1,2,3,4'

  • एक सरणी

    CREATE FUNCTION my_method(INT[]) RETURNS VOID AS $$ 
         ... 
    END $$ LANGUAGE plpgsql; 
    

    तो

    SELECT my_method('{1,2,3,4}') 
    
  • बाँध चर का उपयोग न करने का निर्णय करने के लिए एक स्ट्रिंग से कास्ट करने के लिए पर Postgres ही भरोसा करते हैं और इसके बजाय वर्तनी वाले सभी पैरामीटर के साथ एक स्पष्ट कमांड स्ट्रिंग जारी करें (आने वाले सभी पैरामीटर को सत्यापित या निकालने के लिए सुनिश्चित करें बाहर से SQL इंजेक्शन हमले से बचने के लिए।)

    CREATE FUNCTION my_method(INT[]) RETURNS VOID AS $$ 
         ... 
    END $$ LANGUAGE plpgsql; 
    
    तो

    SELECT my_method(ARRAY [1,2,3,4]) 
    
+0

धन्यवाद! नहीं, मैंने नहीं किया था, मैं इस बात पर भरोसा कर रहा था कि मेरे सहयोगियों ने मुझे क्या बताया था। मैं इसे एक शॉट दूंगा। –

+1

क्या आपके पास पीजी में तैयार बयानों के मूल समर्थन की कमी के संबंध में कोई सबूत है? मुझे [मैनुअल] (http://www.postgresql.org/docs/9.2/static/sql-prepare.html) में उस तथ्य का कोई उल्लेख नहीं मिला। लॉगिंग के लिए, मुझे लगता है कि सर्वर क्वेरी को लॉग करता है क्योंकि उन्हें क्लाइंट से पारित नहीं किया जाता है, इस प्रकार लॉग में कोई "निष्पादन" कथन नहीं होता है। –

+1

@IhorKaharlichenko शब्द खराब था, और ऑफ-विषय था। जवाब संपादित किया। पुन। मूल दावा, ड्राइवर 'PREPARE' का उपयोग नहीं करेंगे जब तक सर्वर-साइड तैयार कथन सक्षम नहीं होते हैं (कभी-कभी स्पष्ट रूप से) और, कुछ मामलों में, जब तक कि कमांड के लिए निश्चित संख्या-निष्पादन थ्रेसहोल्ड पार नहीं किया जाता है। यदि 'postgresql.conf' में कमांड लॉगिंग सक्षम है तो आप वास्तविक' SELECT'/'INSERT'/etc देखेंगे। आदेश देता है जब सर्वर-साइड तैयार कथन का उपयोग नहीं किया जाता है। – vladr

35

मुझे पता है यह एक पुराने सवाल है, लेकिन यह मुझे कई घंटे लगे एक अच्छा समाधान खोजने के लिए और सोचा था कि मैं ' मैंने here पर सीखा है और किसी और को परेशानी बचाई है। उदाहरण के लिए प्रयास करें,

SELECT * FROM some_table WHERE id_column = ANY(@id_list) 

जहां @id_list

command.Parameters.Add("@id_list", NpgsqlDbType.Array | NpgsqlDbType.Integer).Value = my_id_list; 

के माध्यम से एक पूर्णांक [] पैरामीटर के लिए बाध्य है, जहां आदेश एक NpgsqlCommand (सी # का उपयोग कर और दृश्य स्टूडियो में Npgsql) है।

+0

उपयोगी जानकारी, धन्यवाद। –

+1

मैं एक अनंत काल की खोज कर सकता था, क्या आपको यह जवाब नहीं मिला था ... – Hambone

2

आप हमेशा एक उचित रूप से स्वरूपित स्ट्रिंग का उपयोग कर सकते हैं। चाल स्वरूपण है।

command.Parameters.Add("@array_parameter", string.Format("{{{0}}}", string.Join(",", array));

ध्यान दें कि यदि आपका सरणी तार की एक सरणी है, तो आप array.Select का उपयोग करना होगा (मूल्य => String.Format ("\" {0} \ ", मूल्य)) या समकक्ष। मैं इस शैली का उपयोग PostgreSQL में एक समेकित प्रकार की सरणी के लिए करता हूं, क्योंकि सरणी से कोई स्वचालित रूपांतरण नहीं होता है।

मेरे मामले में, मेरे गणित प्रकार में 'मान 1', 'value2' जैसे कुछ मान हैं, 'value3', और मेरे सी # गणना से मेल खाने वाले मान हैं। मेरे मामले में, अंतिम SQL क्वेरी कुछ (E '{"value1", "value2"}') की तरह दिखती है, और यह काम करता है।

+1

बेशक, एसक्यूएल इंजेक्शन के बारे में सभी मानक चेतावनियां लागू होती हैं – brichins

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