2014-06-15 9 views
8

में काम नहीं कर रहा है मैंने System.Data.SQLite.SQLiteFunction का उपयोग कर C# में कुछ कस्टम SQLite फ़ंक्शंस बनाए हैं। प्रश्नों को निष्पादित करने के लिए SQLiteDataAdapter का उपयोग करते समय यह बहुत अच्छा काम करता है, यह काम नहीं करता है, हालांकि, लिंक से SQL का उपयोग करते समय मुझे त्रुटियां मिलती हैं कि यह कार्य मौजूद नहीं है।SQLite.net SQLiteFunction लिंक से SQL

मुझे लगता है कि नीचे की रेखा है, मैं लिंक से SQL में काम करने के लिए कस्टम SQLiteFunctions कैसे प्राप्त कर सकता हूं? या तो उन्हें जिस तरह से वे चाहते हैं या SQLite.Net के स्रोत कोड को संशोधित करके लोड करने के लिए प्राप्त कर रहे हैं, तो वे डीएलएल का हिस्सा हैं?

नोट: मैं समझता हूं कि इकाई फ्रेमवर्क को प्राथमिकता दी जाती है, यह विरासत अनुप्रयोग है और मेरे पास इसे बदलने का विकल्प नहीं है। मैंने मैन्युअल रूप से DataContext.Connection, कोई पासा पर फ़ंक्शंस को बाध्य करने का प्रयास नहीं किया।


System.Data.SQLite को संशोधित करने की कोशिश के बारे में पृष्ठभूमि: मैं स्रोत कोड डाउनलोड करने का प्रयास है, मैं सफलतापूर्वक स्रोत से निर्माण कर सकते हैं, लेकिन स्रोत कोड मेरे लिए थोड़ा पेचीदा है।

  • सिस्टम में। डेटा। SQLite.2012 प्रोजेक्ट में, परियोजना में कोई फ़ाइल शामिल नहीं है, लेकिन सभी स्रोत फ़ाइलें वास्तविक फ़ोल्डर में मौजूद हैं। वे System.Data.SQLite.Files.targets नामक फ़ाइल में समाधान में शामिल होने लगते हैं। यह मेरे लिए एक अजीब सेटअप है।
  • मैंने प्रोजेक्ट फ़ोल्डर में अपने कस्टम फ़ंक्शंस जोड़े, लेकिन उन्हें अन्य सभी फ़ाइलों की तरह प्रोजेक्ट में शामिल नहीं किया। मैंने उन्हें सिस्टम में जोड़ा। डेटा। SQLite.Files.targets।
  • मैंने समाधान बनाया और वे असेंबली में दिखाई देते हैं। हालांकि मैं असेंबली में फ़ाइलों को जोड़ने और निर्माण करने के लिए प्रतीत होता हूं, मौजूदा कोड को संशोधित करने से कोई प्रभाव नहीं पड़ता है।
  • मैं SQLiteConnection क्लास में गया और ओपन विधि में एक नया नया अपवाद जोड़ा, मैंने कंसोल जोड़ा है। मुख्य स्थानों में राइटलाइन, कुछ भी जो मैं मौजूदा कोड में संशोधित करता हूं उसे संकलित असेंबली में नहीं लगता है।

इसका लक्ष्य प्रतिबिंब के माध्यम से स्वत: लोडिंग पर भरोसा करने के बजाय System.Data.SQLite.dll में अपने कस्टम कार्यों को बनाने और बनाने का लक्ष्य था।

+1

'ट्वाइलाइट' से पढ़ना मुश्किल है – rpax

उत्तर

19

बस उस पल मैं यह अच्छा टुकड़ा from this question

// from https://stackoverflow.com/questions/172735/create-use-user-defined-functions-in-system-data-sqlite 
// taken from http://sqlite.phxsoftware.com/forums/p/348/1457.aspx#1457 
[SQLiteFunction(Name = "REGEXP", Arguments = 2, FuncType = FunctionType.Scalar)] 
public class RegExSQLiteFunction : SQLiteFunction { 
    public override object Invoke(object[] args) { 
     return System.Text.RegularExpressions.Regex.IsMatch(Convert.ToString(args[1]), Convert.ToString(args[0])); 
    } 
} 

पाया लेकिन यह कैसे उपयोग करने के लिए नहीं मिला। अब एक SQLiteConnection.BindFunction विधि है।

public static void BindFunction(this SQLiteConnection connection, SQLiteFunction function) 
{ 
    var attributes = function.GetType().GetCustomAttributes(typeof(SQLiteFunctionAttribute), true).Cast<SQLiteFunctionAttribute>().ToArray(); 
    if (attributes.Length == 0) { 
     throw new InvalidOperationException("SQLiteFunction doesn't have SQLiteFunctionAttribute"); 
    } 
    connection.BindFunction(attributes[0], function); 
} 

और अब तुम सिर्फ

using (var connection = new SQLiteConnection("Data Source=YourDB.sqlite")) 
{ 
    connection.Open(); // Connection must be open to bind a function 

    connection.BindFunction(new RegExSQLiteFunction()); 

    // Here create a command, and try REGEXP, for example 
    // SELECT * FROM "table" WHERE "column" REGEXP '(?i)\btest\b' 
    // looks for the word 'test', case-insensitive in a string column 
} 

करने के लिए है अब कैसे आप एसक्यूएल के लिए LINQ में कर सकते हैं, मैं वास्तव में नहीं जानता कि क्योंकि मैं: यह बदसूरत तो मैं एक छोटे से विस्तार विधि बनाया है मुझे LINQ IQueryProvider पर अपना स्वयं का एसक्यूएल मिला है। इस प्रकार आप मूल आईडीबीकनेक्शन, आईडीबीकॉमैंड, आईडीबीडेटा पैरामीटर और आईडीटा रीडर इंटरफेस और आपके कस्टम एसक्यूएलएट फ़ंक्शन के साथ ऐसा कर सकते हैं।

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