2011-03-04 12 views
8

Mam bazy danych SQLite w jednym systemie, muszę wyodrębnić dane przechowywane w SQLite do bazy danych Oracle. Jak mam to zrobic?SQLite do Oracle

Odpowiedz

0

Będziesz musiał przekonwertować SQLite na plik tekstowy (nie pewny formatu), a następnie użyć Oracle do załadowania bazy danych z tekstu (źródło: http://www.orafaq.com/wiki/SQLite). Możesz użyć polecenia .dump z interaktywnej powłoki SQLite do zrzutu do pliku tekstowego (zobacz składnię w podpunkcie the docs).

0

SQL Loader to narzędzie, które odczyta rozgraniczony plik tekstowy i zaimportuje go do bazy danych Oracle. Będziesz musiał zmapować sposób, w jaki każda kolumna z pliku płaskiego z sqlite pasuje do odpowiadającej jej w bazie danych Oracle. Oto dobry FAQ, który powinien pomóc Ci zacząć.

7

Firma Oracle oferuje produkt o nazwie Oracle Database Mobile Server (wcześniej o nazwie Oracle Database Lite), który umożliwia synchronizację między bazą danych SQLite i bazą danych Oracle. Zapewnia skalowalną dwukierunkową synchronizację, mapowanie schematów, bezpieczeństwo itd. Serwer mobilny obsługuje synchroniczną i asynchroniczną synchronizację danych. Jeśli jest to więcej niż jednorazowy eksport i musisz zachować synchronizację danych SQLite i Oracle, jest to świetne narzędzie!

Nota prawna: Jestem jednym z Product Managers dla Oracle Database Mobile Server, więc jestem nieco stronniczy. Jednakże, Mobile Server jest naprawdę świetnym narzędziem do utrzymywania synchronizacji SQLite (lub Berkeley DB) i baz danych Oracle.

0

Jeśli jesteś programistą, możesz utworzyć aplikację do przeprowadzenia synchronizacji. byś zrobił

SELECT name FROM sqlite_master WHERE type='table'

uzyskać nazwy tabel, a następnie można odtworzyć je w Oracle (można zrobić DROP TABLE tablename w Oracle po pierwsze, aby uniknąć konfliktu, zakładając SQLite będzie autorytatywny) z CREATE TABLE poleceń . Pierwsze kolumny dla każdego z nich trwa

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

A potem trzeba analizować wynik:

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 mogą być wykorzystywane do zbierania nazwę tabeli z kolumnami, aby utworzyć polecenie INSERT . Aby dodać wartości, byłoby po prostu kwestią zrobienia SELECT * FROM MyTable dla każdej z tabel podczas pętli poprzez nazwy tabel, które otrzymałeś z pierwotnego zapytania. byś iteracyjne kolumn wierszy DataTable pan wrócił i dodać wartości do StringBuilder:

INSERT INTO MyTable ( + Columna, columnB itp + ) VALUES ( DataRow [0], DataRow [1], itd. + ) .

Nie do końca tak - wpisujesz dane, dołączając nazwę kolumny i jej dane w trakcie wykonywania pętli. Możesz uzyskać nazwy kolumn przez dodanie s w tej pętli foreach powyżej. Każda wartość kolumny jest następnie ustawiana za pomocą pętli foreach, która daje każdemu object obj in drData.ItemArray. Jeśli wszystko, co masz, to pola tekstowe, to proste, wystarczy dodać obj.ToString() do swojej wartości StringBuilder dla każdej wartości kolumny w zapytaniu, tak jak poniżej. Następnie uruchamiasz zapytanie po zebraniu wszystkich wartości kolumn dla każdego wiersza. Używasz nowego StringBuilder dla każdego wiersza - musi on zostać zresetowany do INSERT INTO MyTable ( + kolumna A, kolumna B itp.+ ) VALUES ( przed każdym nowym wierszem, aby można było dodać nowe wartości kolumn.

Jeśli mieszane typy danych (tj DATE, BLOB, itd.), Trzeba określić typy kolumn po drodze, należy go przechowywać w wykazie lub tablicy, a następnie użyć licznika, aby określić, że indeks list/array slot i pobierz typ, dzięki czemu wiesz jak przetłumaczyć twój obiekt na coś, czego Oracle może użyć - czy to oznacza po prostu dodanie to_date() do wyniku, z formatowaniem, dla daty (ponieważ SQLite przechowuje je jako ciągi daty w formacie yyyy-MM-dd HH:mm:ss) lub dodanie go do OracleParameter dla i wysłanie go do funkcji RunOracleCommand. (I nie idź do tego poniżej).

Umieszczenie wszystko to razem daje to:

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

Wszystko to zakłada masz RunOracleCommand() utratę funkcji, które można wziąć polecenia SQL i uruchomić go przed funkcja Oracle DB i funkcja GetSQLiteTable(), która może zwrócić tabelę DataTable z bazy danych SQLite poprzez przekazanie jej polecenia SQL.

Należy zauważyć, że ten kod nie został przetestowany, ponieważ napisałem go bezpośrednio w tym poście, ale jest on oparty na kodzie, który napisałem, aby zsynchronizować Oracle z SQLite, który został przetestowany i działa.