私はSQLiteデータベースを1つのシステムに持っているので、SQLiteに格納されたデータをOracleデータベースに抽出する必要があります。これはどうすればいいですか?SQLite to Oracle
答えて
SQLiteをテキストファイル(形式が特定されていない)に変換してから、Oracleを使用してテキストからデータベースをロードする必要があります(ソースはhttp://www.orafaq.com/wiki/SQLite)。 SQLiteの対話シェルから.dump
コマンドを使用してテキストファイルにダンプすることができます(構文についてはthe docsを参照してください)。
SQLローダーは、区切られたテキストファイルを読み込んでOracleデータベースにインポートするユーティリティです。フラット・ファイルからsqliteの各列がOracleデータベースの対応する列にどのように一致するかをマップする必要があります。ここでは、あなたが始めるのに役立つ良いFAQです。
Oracleには、Oracle Database Mobile Server(以前はOracle Database Liteと呼ばれていた製品)があり、SQLiteとOracleデータベースの間で同期化することができます。スケーラブルな双方向同期、スキーママッピング、セキュリティなどを提供します。Mobileサーバーは、同期データ同期と非同期データ同期の両方をサポートします。これが1回限りのエクスポートであり、SQLiteとOracleデータベースを同期させておく必要がある場合、これは素晴らしいツールです!
免責事項:私はOracle Database Mobile Serverのプロダクト・マネージャの1つで、私は少し偏っています。しかし、Mobileサーバーは、SQLite(またはBerkeley DB)とOracleデータベースを同期させておくための優れたツールです。
開発者は、同期を実行するアプリケーションを開発することができます。あなたは、あなたがCREATE TABLE
コマンドで(あなたはSQLiteのは権威になると仮定すると、競合を避けるために、最初のOracleでDROP TABLE tablename
を行うことができます)のOracleでそれらを再作成することができ、テーブル名を取得するために
SELECT name FROM sqlite_master WHERE type='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
を実行するだけです。あなたが返されたデータテーブルの行の列を反復処理しStringBuilder
に値を追加します。
INSERT INTO MyTable (
+ columnA、columnBなど+ ) VALUES (
のDataRow [0]、データロー[1]など+ )
。
そうではありませんが、ループを実行するときに列名とそのデータを追加してデータを入力します。上記のforeach
ループの中にs
を追加することによって列名を得ることができます。それぞれの列の値は、foreach
ループを使用して設定されます。これはそれぞれobject obj in drData.ItemArray
です。文字列フィールドをすべて持っている場合は簡単ですが、StringBuilder
には、以下のようにクエリの各列の値にobj.ToString()
を追加してください。次に、各行のすべての列値を収集した後で照会を実行します。各行に新しいStringBuilder
を使用します。INSERT INTO MyTable (
+ columnA、columnBなどにリセットする必要があります。新しい行の前に+ ) VALUES (
を追加すると、新しい列の値を追加できます。
データ型が混在している場合(つまり、DATE
、BLOB
など)、途中で列の種類を判断し、リストまたは配列に格納し、カウンタを使用してインデックスを決定する必要がありますリスト/配列のスロットを取得して型を取得することで、オブジェクトをOracleが使用できるものに変換する方法を知ることができます。つまり、書式設定を使用してto_date()
を日付に追加するだけです(SQLiteでは、 yyyy-MM-dd HH:mm:ss
)、それをBLOB
のOracleParameter
に追加し、それを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());
}
}
}
}
}
}
このすべては、あなたがSQLコマンドを取り、に対してそれを実行することができますRunOracleCommand()
void関数を持っていると仮定しOracle DB、およびGetSQLiteTable()
関数は、SQLコマンドを渡してSQLite DBからDataTableを返すことができます。
このコードは、この記事で直接書いたので、テストされていませんが、テスト済みで動作するSQLiteにOracleを同期するためのコードに大きく基づいています。
- 1. SQLite to MYSQL
- 2. sqlite to postgres rails 3
- 3. MS Access to Oracleデータベース
- 4. Oracle AWR to CSV converter?
- 5. sharepoint 2007 from sql server to oracle
- 6. SQLite to MySQLの奇妙なエラー#1064
- 7. LINQ to SQL with Oracleを使用
- 8. Oracle PL/SQL参照カーソルhow to
- 9. OracleのROWNUMに相当するSQLite?
- 10. Beginner to sqlite - データベースを作成できません
- 11. SQLiteのクエリ結果行の時間差:How To?
- 12. Log4Net to Oracle - > "ConverterType is null"でPatternLayoutが失敗する
- 13. OracleのINTERVAL DAY TO SECONDデータ型のためのNHibernateマッピング
- 14. Oracle To Postgres、MySQLまたはMS Accessの移行
- 15. HQL to SQL:NetbeansでOracleデータベースを照会する
- 16. phonegap SQL Server 2005/Oracleを使用したsqlite sync API
- 17. CGContextAddEllipseInRect to CGImageRef to CGImageMaskCreate to CGContextClipToMask
- 18. Actionscript3 to LLVM to?
- 19. Facebook post to wall to work to work
- 20. xml to html to xml
- 21. Java to JRuby to Resque
- 22. View to Model to Settings
- 23. node.js:youtube to mp4 to mp3
- 24. three.js to webGL to OpenGL
- 25. UILabel to NSString to webview
- 26. と[Db to PHP to JSON to AJAX to HTML]速度差
- 27. SqliteをSQLiteにも使用
- 28. ruby on rail to users to timezone
- 29. LINQ to SQLとLINQ to DataSet
- 30. Linq to SQL One To Many