2011-03-04 12 views
8

मेरे पास एक सिस्टम में SQLite डेटाबेस है, मुझे SQLite में Oracle डेटाबेस में संग्रहीत डेटा निकालने की आवश्यकता है। मैं यह कैसे करु?SQLite से Oracle

उत्तर

0

आपको SQLite को एक टेक्स्ट फ़ाइल (प्रारूप में से कुछ नहीं) में कनवर्ट करना होगा और फिर टेक्स्ट से डेटाबेस लोड करने के लिए ओरेकल का उपयोग करना होगा (स्रोत http://www.orafaq.com/wiki/SQLite है)। आप SQLite इंटरैक्टिव शैल से .dump कमांड का उपयोग टेक्स्ट फ़ाइल में डंप करने के लिए कर सकते हैं (वाक्यविन्यास के लिए the docs देखें)।

0

एसक्यूएल लोडर एक उपयोगिता है जो एक सीमित पाठ फ़ाइल पढ़ेगी और इसे एक ऑरैकल डेटाबेस में आयात करेगी। आपको मानचित्रण करने की आवश्यकता होगी कि आपकी फ्लैट फ़ाइल से प्रत्येक कॉलम स्क्लाइट मैचों से बाहर ओरेकल डेटाबेस में संबंधित एक से मेल खाता है। यहां एक अच्छा FAQ है जो आपको प्रारंभ करने में मदद कर सकता है।

7

ओरेकल Oracle Database Mobile Server (जिसे पहले ओरेकल डेटाबेस लाइट कहा जाता है) नामक उत्पाद प्रदान करता है जो आपको SQLite और Oracle डेटाबेस के बीच सिंक्रनाइज़ करने की अनुमति देता है। यह स्केलेबल द्वि-दिशात्मक सिंक, स्कीमा मैपिंग, सुरक्षा इत्यादि प्रदान करता है। मोबाइल सर्वर सिंक्रोनस और एसिंक्रोनस डेटा सिंक दोनों का समर्थन करता है। यदि यह एक बार निर्यात से अधिक है और आपको अपने SQLite और Oracle डेटाबेस को सिंक में रखने की आवश्यकता है, तो यह एक अच्छा टूल है!

अस्वीकरण: मैं ओरेकल डेटाबेस मोबाइल सर्वर के लिए उत्पाद प्रबंधक में से एक हूं, इसलिए मैं थोड़ा पक्षपातपूर्ण हूं। हालांकि, मोबाइल सर्वर वास्तव में सिंक में अपने SQLite (या बर्कले डीबी) और ओरेकल डेटाबेस को रखने के लिए उपयोग करने के लिए एक शानदार टूल है।

0

यदि आप एक डेवलपर हैं, तो आप सिंक करने के लिए एक एप्लिकेशन विकसित कर सकते हैं। आप

SELECT name FROM sqlite_master WHERE type='table'

करते हैं, तालिका नाम पाने के लिए चाहते हैं तो आप कर सकता है उन्हें Oracle में (आप पहले Oracle में DROP TABLE tablename कर सकते हैं, एक संघर्ष से बचने के लिए, यह मानते हुए SQLite आधिकारिक हो जाएगा) फिर से बनाने CREATE TABLE आदेशों के साथ । हर एक के लिए कॉलम हो रही लेता

SELECT sql FROM sqlite_master WHERE type='table' and name='MyTable'

और फिर आप परिणाम पार्स करने के लिए है:

string columnNames = sql.replace(/^[^\(]+\(([^\)]+)\)/g, '$1').replace(/ [^,]+/g, '').split(','); 
string[] columnArray = columnNames.Split(','); 
foreach (string s in columnArray) 
{ 
    // Add column to table using: 
    // ALTER TABLE MyTable ADD COLUMN s NVARCHAR(250) 
} 

एक StringBuilder अपने INSERT आदेश बनाने के लिए अपने कॉलम के साथ तालिका नाम इकट्ठा करने के लिए इस्तेमाल किया जा सकता । मान जोड़ने के लिए, यह आपके लूप के दौरान प्रारंभिक क्वेरी से वापस आने वाले तालिका नामों के माध्यम से प्रत्येक तालिका के लिए SELECT * FROM MyTable करने का विषय होगा। आप datatable आप लौट रहे थे की पंक्तियों के स्तंभों पुनरावृति और StringBuilder में मान जोड़ते हैं:

INSERT INTO MyTable ( + Columna, columnB, आदि + ) VALUES ( DataRow [0], DataRow [1], आदि + )

बिलकुल ठीक नहीं है, हालांकि - आप लूप के माध्यम से कॉलम नाम और उसके डेटा को जोड़कर डेटा भरते हैं। आप ऊपर foreach लूप में s जोड़कर कॉलम नाम प्राप्त कर सकते हैं। प्रत्येक कॉलम मान को foreach लूप का उपयोग करके सेट किया जाता है जो आपको प्रत्येक object obj in drData.ItemArray देता है। यदि आपके पास स्ट्रिंग फ़ील्ड्स हैं, तो यह आसान है, आप अपनी क्वेरी में प्रत्येक कॉलम मान के लिए StringBuilder पर obj.ToString() जोड़ें। फिर आप प्रत्येक पंक्ति के लिए सभी कॉलम मान एकत्र करने के बाद क्वेरी चलाते हैं। आप प्रत्येक पंक्ति के लिए एक नया StringBuilder का उपयोग करते हैं - इसे INSERT INTO MyTable ( + कॉलम ए, कॉलम बी आदि पर रीसेट करने की आवश्यकता है।प्रत्येक नई पंक्ति से पहले + ) VALUES (, इसलिए नए कॉलम मानों को जोड़ा जा सकता है।

यदि आपके पास मिश्रित डेटाटाइप (यानी DATE, BLOB इत्यादि) हैं, तो आपको कॉलम प्रकारों को एक सूची या सरणी में स्टोर करने की आवश्यकता होगी, फिर उस सूचकांक को निर्धारित करने के लिए काउंटर का उपयोग करें सूची/सरणी स्लॉट और प्रकार प्राप्त करें, इसलिए आप जानते हैं कि ऑब्जेक्ट का उपयोग किसी ऑब्जेक्ट में कैसे किया जा सकता है - चाहे इसका मतलब है कि to_date() परिणाम के साथ स्वरूपण के साथ, दिनांक के बाद (SQLite इन्हें प्रारूप के साथ दिनांक तारों के रूप में संग्रहीत करता है yyyy-MM-dd HH:mm:ss), या इसे OracleParameter पर BLOB के लिए जोड़कर उसे RunOracleCommand फ़ंक्शन के साथ भेजना। (मैं इस में नीचे जाना नहीं था।)

यह सब लाना एक साथ इस पैदावार:

string[] columnArray = null; 
DataTable dtTableNames = GetSQLiteTable("SELECT name FROM sqlite_master WHERE type='table'"); 
if (dtTableNames != null && dtTableNames.Rows != null) 
{ 
    if (dtTableNames.Rows.Count > 0) 
    { 
     // We have tables 
     foreach (DataRow dr in dtTableNames.Rows) 
     { 
      // Do everything about this table here 
      StringBuilder sb = new StringBuilder(); 
      sb.Append("INSERT INTO " + tableName + " ("); // we will collect column names here 

      string tableName = dr["NAME"] != null ? dr["NAME"].ToString() : String.Empty; 
      if (!String.IsNullOrEmpty(tableName)) 
      { 
       RunOracleCommand("DROP TABLE " + tableName); 
       RunOracleCommand("CREATE TABLE " + tableName); 
      } 

      DataTable dtColumnNames = GetSQLiteTable("SELECT sql FROM sqlite_master WHERE type='table' AND name='"+tableName+"'"); 
      if (dtColumnNames != null && dtColumnNames.Rows != null) 
      { 
       if (dtColumnNames.Rows.Count > 0) 
       { 
        // We have columns 
        foreach (DataRow drCol in dtTableNames.Rows) 
        { 
          string sql = drCol["SQL"] != null ? drCol["SQL"].ToString() : String.Empty; 
          if (!String.IsNullOrEmpty(sql)) 
          { 
           string columnNames = sql.replace(/^[^\(]+\(([^\)]+)\)/g, '$1').replace(/ [^,]+/g, '').split(','); 
           columnArray = columnNames.Split(','); 
           foreach (string s in columnArray) 
           { 
            // Add column to table using: 
            RunOracleCommand("ALTER TABLE " + tableName + " ADD COLUMN " + s + " NVARCHAR(250)"); // can hard-code like this or use logic to determine the datatype/column width 
            sb.Append("'" + s + "',"); 
           } 
           sb.TrimEnd(","); 
           sb.Append(") VALUES ("); 
          } 
         } 
        } 
      } 

      // Get SQLite Table data for insertion to Oracle 
      DataTable dtTableData = GetSQLiteTable("SELECT * FROM " + tableName); 
      if (dtTableData != null && dtTableData.Rows != null) 
      { 
       if (dtTableData.Rows.Count > 0) 
       { 
        // We have data 
        foreach (DataRow drData in dtTableData.Rows) 
        { 
         StringBuilder sbRow = sb; // resets to baseline for each row 
         foreach (object obj in drData.ItemArray) 
         { 
          // This is simplistic and assumes you have string data for an NVARCHAR field 
          sbRow.Append("'" + obj.ToString() + "',"); 
         } 
         sbRow.TrimEnd(","); 
         sbRow.Append(")"); 
         RunOracleCommand(sbRow.ToString()); 
        } 
       } 
      } 
     } 
    } 
} 

आप इस सब के सब एक RunOracleCommand() शून्य समारोह है कि किसी SQL आदेश लेने के लिए और के खिलाफ चला सकते है मानता है एक ओरेकल डीबी, और GetSQLiteTable() फ़ंक्शन जो SQL सर्वर को पास करके SQLite DB से डेटाटेबल वापस कर सकता है।

ध्यान दें कि यह कोड अनचाहे है, क्योंकि मैंने इसे सीधे इस पोस्ट में लिखा था, लेकिन यह उस कोड पर आधारित है जिसे मैंने ओरेकल को SQLite में सिंक करने के लिए लिखा था, जिसका परीक्षण और काम किया गया है।