请教SQLite与SQLServer两个数据库数据互导的问题

请教SQLite与SQLServer两个数据库数据互导的问题,第1张

将sqlite文件上传至电脑,然后使用c#写段代码,直接访问电脑上的sqlite文件,导入到sqlserver, 思路很直接。难度也不大。

反过来也是,用C#读sql server 然后写入到sqlite

在网上找了大把大把的资料、还是没能怎么弄清楚关于SQLite升级。固把一些网上找到的资料跟自己摸索出来的东西一起发出来。望有厉害的前辈能够指点一二。 先上网上一些高手的资料:blog/yaya_soft/article/details/17089353 、 /topic/1127838。其中我所在的情况跟第三位前辈所遇到的情况一样, 先说Android SQLite吧, Android系统本身自带了一个建立SQLite的工具SQLiteOpenHelper、我们只要继承它,里面有几个重写的方法。 为了方便快捷、我只列出了onCreate方法跟onUpgrade方法。 onCreate方法是我们第一次创建数据库的时候会调用,onUpgrade()是我们数据库版本号不一样的时候会调用。网上很多资料都说如果要进行数据库升级,那就直接在onUpgrade里面写你所需要的进行的 *** 作。比如:至于里面代码具体的作用可以参照上面第一 第二个链接,里面有详细解释。 本人的情况是:本人使用外带的可视化工具直接把数据库跟表都已经建立好了,直接复制在raw目录下面。就没有通过系统自带的方法来建立数据库跟表。于是网上找资料一直不明白他们所谓的 在onUpgrade里面进行升级。 因为本人代码压根就没onUpgrade方法可以使用。 完了在网上找到各种资料、最终明白:无论你是用系统自带的SQLiteOpenHelper工具建立数据库跟表、还是使用外带工具。如果你要进行数据库升级。你所需要的 *** 作都是一样的。只是系统自带的里面有onUpgrade()方法直接调用。而用外带工具的话你肯定也有一个自己写的SQLite *** 作类、只是使用自己写的 *** 作类的话、onUpgrade()方法也是我们自己写。 反正里面要进行的 *** 作都是一样的。现在就看看如何进行数据库升级。关于这块代码、如果你使用自己写的SQLite *** 作类,那你一看就明白。我们只需要得到db对象。就可以使用 dbexecSQL("ALTER TABLE Subscription ADD COLUMN Activation BLOB"); 这个和SQLiteOpenHelper里面onUpgrade()方法里面的 *** 作是一样的;同样是升级数据库的 *** 作。 接下来就说说怎么判断数据库需要升级、这个就是涉及到版本匹配了、再看这块代码、我们只要拿到db对象、就可以拿到db对应的版本、同时也可以更新db 的版本。完了我们可以参照上面链接中第三位前辈的方法、把我们最新的数据库版本定义在versionCode在AndroidManifestxml文件中。 这样你最新数据库版本跟以前数据库版本都有了 、就可以判断更新不更新。这里解释下关于外带数据库的一些事情: 外带数据即我们通过sqlite expert professional可视化 工具建立一个sqlitedb文件、同时把文件放在raw目录下、我们每次进行数据库 *** 作的时候就会先把raw目录下的sqlitedb复制到手机里面的路径下(如果手机路径里面存在sqlitedb就不复制)、完了以后每次取数据库都是从手机路径里面取的。如果我们raw目录下的sqlitedb进行了更新(我们自己把数据表改下、直接替换 )同时我们的apk版本进行升级更新的时候覆盖安装apk。我们手机目录下的sqlitedb是不会更新的,还是旧版本。 但是我们raw目录下的sqlitedb是新版本。这个时候也不会再复制到手机。 这就需要我们把手机目录下的sqlitedb替换成raw目录下的。 写到这里我又想起一个事情:以前有位同事问为什么要把raw目录下的sqlitedb复制到手机、然后又 *** 作手机路径下的sqlitedb 这不是多此一举吗。他说可以把sqlitedb放在assets目录下、不复制到手机路径。直接就是 *** 作assets目录下的sqlitedb,这样每次数据库更新就直接替换assets目录下的sqlitedb。 我不知道放在assets目录下的好处、同时也不知道放在raw 然后复制到手机路径的好处。 这些我都不知道(望高人指点), 我只知道反正就是不能直接替换salitedb , 直接替换的话就是把旧版本的sqlitedb删除、再安装新版本的sqlitedb。如果这样 *** 作的话好像以前的数据都会丢失、就好像卸载重装一样。 无论何种方式我们要想保留数据都要进行数据的转移。关于数据转移前面给的链接中有。这里就不多讨论了。 发这篇文章只是自己搞这块的时候,一直被网上说的在onUpgrade()方法中直接更新搞糊涂了。 在这里记下来、免得下次不记得。

下载systemdatasqlite安装包,在systemdatasqliteorg上下载对应NET Framework xx版本的安装包。安装systemdatasqlite,按照提示一步一步执行即可。

下载SQLiteStudio,直接运行exe文件。创建数据库,以及 *** 作数据表等等。

环境搭建好后就开始创建C#工程了,这里举例创建了一个Winform工程。在工程里引入systemdatasqlitedll。注意:引用窗口打开后选择浏览,在安装目录下找到dll。默认安装路径是 C:\Program Files\SystemDataSQLite\2010\bin。如果不是使用VS2010,路径会不同

除了引用systemdatasqlite以外,还需要把SQLiteInteropdll复制到程序根目录。

5

至此C# *** 作SQLite的开发环境就搭建好了。

SQLite3是目前最新的SQLite版本。可以从网站上下载SQLite3的源代码(本书使用的版本是sqlite-3612targz)。

解压缩后进入sqlite-3612的根目录,首先命令“/configure”生成Makefile文件,接着运行命令“make”对源代码进行编译,最后运行命令“make install”安装SQLite3。安装完毕后,可以运行命令sqlite3查看SQLite3是否能正常运行,如下所示

[root@localhost ~]# sqlite3

SQLite version 3612

Enter "help" for instructions

Enter SQL statements terminated with a ";"

sqlite>

可以看到,SQLite3启动后会停留在提示符sqlite>处,等待用户输入SQL语句。

在使用SQLite3前需要先了解下SQLite3支持的数据类型。SQLite3支持的基本数据类型主要有以下几类:

NULL

NUMERIC

INTEGER

REAL

TEXT

SQLite3会自动把其他数据类型转换成以上5类基本数据类型,转换规则如下所示:

char、clob、test、varchar—> TEXT

integer—>INTEGER

real、double、float—> REAL

blob—>NULL

其余数据类型都转变成NUMERIC

下面通过一个实例来演示SQLite3的使用方法。

新建一个数据库

新建数据库testdb(使用db后缀是为了标识数据库文件)。在testdb中新建一个表test_table,该表具有name,、sex、age三列。SQLite3的具体 *** 作如下所示:

[root@localhost home]# sqlite3 testdb

SQLite version 3612

Enter "help" for instructions

Enter SQL statements terminated with a ";"

sqlite> create table test_table(name, sex, age);

如果数据库testdb已经存在,则命令“sqlite3 testdb”会在当前目录下打开testdb。如果数据库testdb不存在,则命令“sqlite3 testdb”会在当前目录下新建数据库testdb。为了提高效率,SQLite3并不会马上创建testdb,而是等到第一个表创建完成后才会在物理上创建数据库。

由于SQLite3能根据插入数据的实际类型动态改变列的类型,所以在create语句中并不要求给出列的类型。

创建索引

为了加快表的查询速度,往往在主键上添加索引。如下所示的是在name列上添加索引的过程。

sqlite> create index test_index on test_table(name);

*** 作数据

如下所示的是在test_table中进行数据的插入、更新、删除 *** 作:

sqlite> insert into test_table values ('xiaoming', 'male', 20);

sqlite> insert into test_table values ('xiaohong', 'female', 18);

sqlite> select from test_table;

xiaoming|male|20

xiaohong|female|18

sqlite> update test_table set age=19 where name = 'xiaohong';

sqlite> select from test_table;

xiaoming|male|20

xiaohong|female|19

sqlite> delete from test_table where name = 'xiaoming';

sqlite> select from test_table;

xiaohong|female|19

批量 *** 作数据库

如下所示的是在test_table中连续插入两条记录:

sqlite> begin;

sqlite> insert into test_table values ('xiaoxue', 'female', 18);

sqlite> insert into test_table values ('xiaoliu', 'male', 20);

sqlite> commit;

sqlite> select from test_table;

xiaohong|female|19

xiaoxue|male|18

xiaoliu|male|20

运行命令commit后,才会把插入的数据写入数据库中。

数据库的导入导出

如下所示的是把testdb导出到sql文件中:

[root@localhost home]# sqlite3 testdb "dump" > testsql;

testsql文件的内容如下所示:

BEGIN TRANSACTION;

CREATE TABLE test_table(name, sex, age);

INSERT INTO "test_table" VALUES('xiaohong','female',19);

CREATE INDEX test_index on test_table(name);

COMMIT;

如下所示的是导入testsql文件(导入前删除原有的testdb):

[root@localhost home]# sqlite3 testdb < testsql;

通过对testsql文件的导入导出,可以实现数据库文件的备份。

1122 SQLite3的C接口

以上介绍的是SQLite3数据库的命令 *** 作方式。在实际使用中,一般都是应用程序需要对数据库进行访问。为此,SQLite3提供了各种编程语言的使用接口(本书介绍C语言接口)。SQLite3具有几十个C接口,下面介绍一些常用的C接口。

sqlite_open

作用:打开SQLite3数据库

原型:int sqlite3_open(const char dbname, sqlite3 db)

参数:

dbname:数据库的名称;

db:数据库的句柄;

sqlite_colse

作用:关闭SQLite3数据库

原型:int sqlite_close(sqlite3 db)

例如:

testc:

#include <stdioh>

#include <sqlite3h>

static sqlite3 db=NULL;

int main()

{

int rc;

rc= sqlite3_open("testdb", &db);

if(rc)

{

printf("can't open database!\n");

}

else

{

printf("open database success!\n");

}

sqlite3_close(db);

return 0;

}

运行命令“gcc –o test testc –lsqlite3”进行编译,运行test的结果如下所示:

[root@localhost home]# open database success!

sqlite_exec

作用:执行SQL语句

原型:int sqlite3_exec(sqlite3 db, const char sql, int (callback)(void,int,char,char), void , char errmsg)

参数:

db:数据库;

sql:SQL语句;

callback:回滚;

errmsg:错误信息

例如:

testc:

#include <stdioh>

#include <sqlite3h>

static sqlite3 db=NULL;

static char errmsg=NULL;

int main()

{

int rc;

rc = sqlite3_open("testdb", &db);

rc = sqlite3_exec(db,"insert into test_table values('daobao', 'male', 24)", 0, 0, &errmsg);

if(rc)

{

printf("exec fail!\n");

}

else

{

printf("exec success!\n");

}

sqlite3_close(db);

return 0;

}

编译完成后,运行test的结果如下所示:

[root@localhost home]# /test

exec success!

[root@localhost home]# sqlite3 testdb

SQLite version 3611

Enter "help" for instructions

Enter SQL statements terminated with a ";"

sqlite> select from test_table;

daobao|male|24

sqlite3_get_table

作用:执行SQL查询

原型:int sqlite3_get_table(sqlite3 db, const char zSql, char pazResult, int pnRow, int pnColumn, char pzErrmsg)

参数:

db:数据库;

zSql:SQL语句;

pazResult:查询结果集;

pnRow:结果集的行数;

pnColumn:结果集的列数;

errmsg:错误信息;

sqlite3_free_table

作用:注销结果集

原型:void sqlite3_free_table(char result)

参数:

result:结果集;

例如:

testc:

#include <stdioh>

#include <sqlite3h>

static sqlite3 db=NULL;

static char Result=NULL;

static char errmsg=NULL;

int main()

{

int rc, i, j;

int nrow;

int ncolumn;

rc= sqlite3_open("testdb", &db);

rc= sqlite3_get_table(db, "select from test_table", &Result, &nrow, &ncolumn,

&errmsg);

if(rc)

{

printf("query fail!\n");

}

else

{

printf("query success!\n");

for(i = 1; i <= nrow; i++)

{

for(j = 0; j < ncolumn; j++)

{

printf("%s | ", Result[i ncolumn + j]);

}

printf("\n");

}

}

sqlite3_free_table(Result);

sqlite3_close(db);

return 0;

}

编译完成后,运行test的结果如下所示:

[root@localhost home]# /test

query success!

xiaohong | female | 19 |

xiaoxue | female | 18 |

xiaoliu | male | 20 |

daobao | male | 24 |

sqlite3_prepare

作用:把SQL语句编译成字节码,由后面的执行函数去执行

原型:int sqlite3_prepare(sqlite3 db, const char zSql, int nByte, sqlite3_stmt stmt, const char pTail)

参数:

db:数据库;

zSql:SQL语句;

nByte:SQL语句的最大字节数;

stmt:Statement句柄;

pTail:SQL语句无用部分的指针;

sqlite3_step

作用:步步执行SQL语句字节码

原型:int sqlite3_step (sqlite3_stmt )

例如:

testc:

#include <stdioh>

#include <sqlite3h>

static sqlite3 db=NULL;

static sqlite3_stmt stmt=NULL;

int main()

{

int rc, i, j;

int ncolumn;

rc= sqlite3_open("testdb", &db);

rc=sqlite3_prepare(db,"select from test_table",-1,&stmt,0);

if(rc)

{

printf("query fail!\n");

}

else

{

printf("query success!\n");

rc=sqlite3_step(stmt);

ncolumn=sqlite3_column_count(stmt);

while(rc==SQLITE_ROW)

{

for(i=0; i<2; i++)

{

printf("%s | ", sqlite3_column_text(stmt,i));

}

printf("\n");

rc=sqlite3_step(stmt);

}

}

sqlite3_finalize(stmt);

sqlite3_close(db);

return 0;

}

编译完成后,运行test的结果如下所示:

[root@localhost home]# /test

query success!

xiaohong | female | 19 |

xiaoxue | female | 18 |

xiaoliu | male | 20 |

daobao | male | 24 |

在程序中访问SQLite3数据库时,要注意C API的接口定义和数据类型是否正确,否则会得到错误的访问结果。

0 引言 我们这篇文章主要讲述了如何在C/C++语言中调用 sqlite 的函数接口来实现对数据库的管理, 包括创建数据库、创建表格、插入数据、查询数据、删除数据等。 1 说明 这里我们假设你已经编译好了sqlite的库文件 : libsqlite3a libsqlite3la libsqlite3so libsqlite3so0 libsqlite3so086 pkgconfig 和可执行文件 : sqlite3 我们再假设你的sqlite3的安装目录在 /usr/local/sqlite3 目录下。 如果不是,我们可以这样做,将你的安装文件复制到 /usr/local/sqlite3 这个目录, 这样我们好在下面的 *** 作中更加统一,从而减少出错的概率 例如:[root@localhost home]# cp -rf sqlite-338-ix86/ /usr/local/sqlite3 这里假设 /home/sqlite-338-ix86/ 是你的安装目录,也就是说你的sqlite原来就是安装在这里 这样之后,我们的sqlite3的库文件目录是:/usr/local/sqlite3/lib 可执行文件 sqlite3 的目录是: /usr/local/sqlite3/bin 头文件 sqlite3h 的目录是: /usr/local/sqlite3/include 好拉,现在开始我们的Linux下sqlite3编程之旅。 2 开始 这里我们现在进行一个测试。 现在我们来写个C/C++程序,调用 sqlite 的 API 接口函数。 下面是一个C程序的例子,显示怎么使用 sqlite 的 C/C++ 接口 数据库的名字由第一个参数取得且第二个参数或更多的参数是 SQL 执行语句 这个函数调用sqlite3_open() 在 16 行打开数据库,并且sqlite3_close() 在 25 行关闭数据库连接。 [root@localhost temp]# vi opendbsqlitec 按下i 键切换到输入模式,输入下列代码:// name: opendbsqlitec // This prog is used to test C/C++ API for sqlite3It is very simple,ha! // Author : zieckey All rights reserved // data : 2006/11/13 #include <stdioh> #include <sqlite3h> int main( void ) { sqlite3 db=NULL; char zErrMsg = 0; int rc; //打开指定的数据库文件,如果不存在将创建一个同名的数据库文件 rc = sqlite3_open("zieckeydb", &db); if( rc ) { fprintf(stderr, "Can't open database: %s ", sqlite3_errmsg(db)); sqlite3_close(db); exit(1); } else printf("You have opened a sqlite3 database named zieckeydb successfully! Congratulations! Have fun ! ^-^ "); sqlite3_close(db); //关闭数据库 return 0; } 退出,保存。(代码输入完成后,按下 Esc 键,然后输入: :wq ,回车就好拉) 好拉,现在编译:[root@localhost temp]# gcc opendbsqlitec -o dbout 或者遇到这样的问题:[root@localhost temp]# gcc opendbsqlitec -o dbout opendbsqlitec:11:21: sqlite3h: 没有那个文件或目录 opendbsqlitec: In function `main': opendbsqlitec:19: `sqlite3' undeclared (first use in this function) opendbsqlitec:19: (Each undeclared identifier is reported only once opendbsqlitec:19: for each function it appears in) opendbsqlitec:19: `db' undeclared (first use in this function) 这是由于没有找到头文件的原因。 也许会碰到类似这样的问题:[root@localhost temp]# gcc opendbsqlitec -o dbout /tmp/ccTkItnNo(text+0x2b): In function `main': : undefined reference to `sqlite3_open' /tmp/ccTkItnNo(text+0x45): In function `main': : undefined reference to `sqlite3_errmsg' /tmp/ccTkItnNo(text+0x67): In function `main': : undefined reference to `sqlite3_close' /tmp/ccTkItnNo(text+0x8f): In function `main': : undefined reference to `sqlite3_close' collect2: ld returned 1 exit status 这是个没有找到库文件的问题。 下面我们着手解决这些问题。 由于用到了用户自己的库文件,所用应该指明所用到的库,我们可以这样编译: [root@localhost temp]# gcc opendbsqlitec -o dbout -lsqlite3 我用用 -lsqlite3 选项就可以了(前面我们生成的库文件是 libsqlite3so086 等, 去掉前面的lib和后面的版本标志,就剩下 sqlite3 了所以是 -lsqlite3 )。 如果我们在编译安装的时候,选择了安装路径,例如这样的话: # /sqlite/configure --prefix=/usr/local/sqlite3 # make 作者:zieckey

以上就是关于请教SQLite与SQLServer两个数据库数据互导的问题全部的内容,包括:请教SQLite与SQLServer两个数据库数据互导的问题、怎样使用sqlite expert管理android手机sqlite数据库、怎么把已有的数据库sqlite等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9817415.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存