Database SQLite到Oracle
我在一个系统中有一个SQLite数据库,我需要将存储在SQLite中的数据提取到Oracle数据库。如何执行此操作?您必须将SQLite转换为文本文件(不确定格式),然后使用Oracle从文本加载数据库(源代码为)。您可以使用SQLite interactive shell中的Database SQLite到Oracle,database,oracle,sqlite,Database,Oracle,Sqlite,我在一个系统中有一个SQLite数据库,我需要将存储在SQLite中的数据提取到Oracle数据库。如何执行此操作?您必须将SQLite转换为文本文件(不确定格式),然后使用Oracle从文本加载数据库(源代码为)。您可以使用SQLite interactive shell中的.dump命令转储到文本文件(有关语法,请参阅)。SQL Loader是一个实用程序,它将读取带分隔符的文本文件并将其导入oracle数据库。您需要映射出sqlite平面文件中的每一列与Oracle数据库中相应列的匹配方式
.dump
命令转储到文本文件(有关语法,请参阅)。SQL Loader是一个实用程序,它将读取带分隔符的文本文件并将其导入oracle数据库。您需要映射出sqlite平面文件中的每一列与Oracle数据库中相应列的匹配方式。以下是一个可以帮助您入门的好方法。Oracle提供了名为(以前称为Oracle Database Lite)的产品,该产品允许您在SQLite和Oracle数据库之间进行同步。它提供可扩展的双向同步、模式映射、安全性等。移动服务器支持同步和异步数据同步。如果这不仅仅是一次导出,而且您需要保持SQLite和Oracle数据库的同步,那么这是一个很棒的工具
免责声明:我是Oracle Database Mobile Server的产品经理之一,所以我有点偏见。然而,移动服务器确实是保持SQLite(或Berkeley DB)和Oracle数据库同步的好工具 如果您是开发人员,您可以开发一个应用程序来执行同步。你会的
从sqlite\u master中选择名称,其中type='table'
要获取表名,可以使用create table
命令在Oracle中重新创建它们(可以先在Oracle中执行DROP table tablename
,以避免冲突,假设SQLite是权威的)。获取每一列所需的时间
从sqlite\u master中选择sql,其中type='table'和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
:
插入MyTable(
+columnA、columnB等)+)值(
数据行[0]、数据行[1]等)+)
不过,情况并非如此——在循环中运行时,通过附加列名及其数据来填充数据。您可以通过在上面的foreach
循环中添加s
来获取列名。然后使用foreach
循环设置每个列的值,该循环提供drData.ItemArray中的每个对象obj。如果您只有字符串字段,那么很简单,您只需为查询中的每个列值添加obj.ToString()
。然后在收集每行的所有列值后运行查询。您为每一行使用一个新的StringBuilder
——它需要重置为插入MyTable(
+columnA、columnB等)+)值(
在每一新行之前,因此可以追加新的列值
如果您有混合数据类型(即DATE
,BLOB
等),您需要在此过程中确定列类型,将其存储在列表或数组中,然后使用计数器确定该列表/数组插槽的索引并获取类型,这样您就知道如何将对象转换为Oracle可以使用的内容—这是否意味着只需将添加到\u 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()
void函数,该函数可以接受SQL命令并对Oracle DB运行该命令,还有一个GetSQLiteTable()
函数,该函数可以通过传递SQL命令从SQLite DB返回数据表
请注意,正如我在本文中直接编写的那样,这段代码未经测试,但它在很大程度上是基于我为将Oracle同步到SQLite而编写的代码,该代码已经过测试并可以正常工作