2011-03-04 12 views
8

Bir sistemde SQLite veritabanı var, SQLite'de depolanan verileri Oracle veritabanına çıkarmam gerekiyor. Bunu nasıl yaparım?SQLite to Oracle

cevap

0

SQLiteyi bir metin dosyasına (formatın bir kısmı değil) dönüştürmeniz ve ardından veritabanını metinden yüklemek için Oracle kullanmanız gerekir (kaynak http://www.orafaq.com/wiki/SQLite). Bir metin dosyasına dökmek için SQLite etkileşimli kabuktan .dump komutunu kullanabilirsiniz (sözdizimi için bkz. the docs).

0

SQL Loader, ayrılmış bir metin dosyasını okuyacak ve bir Oracle veritabanına aktaracak bir yardımcı programdır. Düz dosyanızdaki sqlite'deki her sütunun Oracle veritabanındaki karşılık gelenle eşleştiğini bulmanız gerekir. Başlamanıza yardımcı olacak iyi bir FAQ.

7

Oracle, SQLite ve Oracle veritabanı arasında eşitlemenizi sağlayan Oracle Database Mobile Server (daha önce Oracle Database Lite olarak adlandırılır) adlı ürünü sağlar. Ölçeklenebilir iki yönlü senkronizasyon, şema eşlemesi, güvenlik vb. Sağlar. Mobil Sunucu hem senkron hem de asenkron veri senkronizasyonunu destekler. Bu bir kerelik bir dışa aktarmadan daha fazlasıysa ve SQLite ve Oracle Veritabanlarınızı senkronize halde tutmanız gerekiyorsa, bu harika bir araçtır!

Yasal Uyarı: Oracle Database Mobile Server için Ürün Yöneticilerinden biriyim, bu yüzden biraz önyargılıyım. Ancak, Mobil Sunucu gerçekten SQLite (veya Berkeley DB) ve Oracle Veritabanlarınızı senkronize halde tutmak için kullanabileceğiniz harika bir araçtır.

0

Geliştiriciyseniz, senkronizasyonu gerçekleştirmek için bir uygulama geliştirebilirsiniz. Daha sonra CREATE TABLE komutlarla (eğer SQLite yetkili olacak varsayarak, bir çelişkiyi önlemek amacıyla, ilk Oracle'da DROP TABLE tablename yapabilir) Oracle bunları yeniden oluşturabilir, masa adlarını almak için

SELECT name FROM sqlite_master WHERE type='table'

yapacağını . Her biri için sütunları alınıyor

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

alır Ve sonra sonuç ayrıştırmak zorunda:

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) 
} 

A StringBuilder sizin INSERT komutu oluşturmak için kendi sütunlu tablo adını toplamak için kullanılabilir . Değerleri eklemek için, ilk sorgudan geri aldığınız tablo adlarıyla, döngü sırasında her bir tablo için SELECT * FROM MyTable yapması gerekir. Sen, iade edilen datatable sıralarının sütunları yineleme ve StringBuilder değerleri eklersiniz:

INSERT INTO MyTable ( + kolumna, columnB vb + ) VALUES ( DataRow [0], DataRow [1], vb + ) .

Tam olarak böyle olmasa da - veriyi, döngü boyunca ilerlerken sütun adını ve verilerini ekleyerek doldurursunuz. Sütun adlarını, yukarıdaki foreach döngüsünde s ekleyerek alabilirsiniz. Her sütun değeri daha sonra her bir object obj in drData.ItemArray veren bir foreach döngü kullanılarak ayarlanır. Sahip olduğunuz tek şey dize alanlarıysa, bu, aşağıdaki gibi, sorgunuzdaki her sütun değeri için obj.ToString()10 kodunuzu StringBuilder'a eklersiniz. Sonra her satır için tüm sütun değerlerini topladıktan sonra sorguyu çalıştırın. Her satır için yeni bir StringBuilder kullanıyorsunuz - sıfırlamak için INSERT INTO MyTable ( + columnA, columnB vb.Her yeni satırdan önce + ) VALUES (, böylece yeni sütun değerleri eklenebilir.

Karışık veri türleri (örneğin, DATE, BLOB, vb.) Varsa, yol boyunca sütun türlerini belirlemeniz, bir liste veya dizide saklamanız, ardından bunun dizinini belirlemek için bir sayaç kullanmanız gerekir. liste/dizi yuvası ve türünü alın, böylece nesneyi Oracle'ın kullanabileceği bir şeye çevirmeyi bilirsiniz - bu, bir tarih için biçimlendirmeyle, sonuç için to_date() eklemesi anlamına gelir (SQLite, bunları tarih dizeleriyle biçim olarak saklar) yyyy-MM-dd HH:mm:ss) veya bir BLOB için bir OracleParameter ekleyerek ve bunu bir RunOracleCommand işlevine göndererek. (Aşağıda, bu işe gitmedim.) Tüm bu koyarak

birlikte bu verir:

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()); 
        } 
       } 
      } 
     } 
    } 
} 

Bütün bunlar bir SQL komutu alıp karşı çalıştırabilirsiniz bir RunOracleCommand() geçersiz fonksiyonu var devraldı Bir SQL komutu geçirerek SQLite DB'nizden bir DataTable döndüren bir Oracle DB ve GetSQLiteTable() işlevi.

Bu kodun doğrudan bu gönderide yazdığım gibi test edilmediğini unutmayın, ancak Oracle tarafından test edilen ve işlenen SQLite'ye senkronize etmek için yazdığım kod esas alınmıştır.