最近做了一个小网站,用到了一个使用sql server 2005的.net cms系统,但是现在我所买虚拟主机的服务商,不给虚拟主机提供sql server服务了,那就转数据库吧,转啥好呢,思来想去,access?刚入行时候用了很久,简单够用,不过实在提不起兴趣了,sqlite?嗯...还没用过,只是简单看过介绍,听说性能还不错,那就试试吧,等等,不知道虚拟主机支持不支持?!百度!然而一大堆没啥用处的提问和回答,也许可能大概是我搜索的关键词不对,懒得管了,年龄大了,没有那个劲儿了,实践出真理,先上手试试验证一下吧,说干就干

先查查怎么在本地创建和管理数据库,然后选择使用了SQLiteStudio这个软件,然后新建个test数据库->随便插条数据->然后在vs创建个test web项目->数据库文件扔进去->新建个页面,查下数据显示到页面->本地运行,ok!,发布,->上传虚拟主机,怀着稍稍激动的心情,打开网址,ok!完全可以!

这么简单吗?nonono,运行之前还是有点小小的障碍的:

首先项目需要用到System.Data.SQLite.dll,到sqlite官网下一个吧,http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki

然后添加引用,引用之后,还需要连接字符串,搜索(ss)! 嗯,和access很像,附个例子:

<add name="ConnectionString" connectionString="Data Source=|DataDirectory|testdb.db;Version=3;Pooling=true;FailIfMissing=false" providerName="System.Data.SQLite" />

这样就可以运行了!具体的参数还有不少,ss一下,根据需求自己设置。

然后开始改cms吧,首先是转数据库,一看表,我尼玛,好多表,自己一个一个建吗?想想都想打消折腾的念头了,有没有什么工具可以借助呢?ss一下,还真有!

SQL server To SQLite DB Convert 这是一位叫liron.levi老外写的,项目地址:https://www.codeproject.com/Articles/26932/Convert-SQL-Server-DB-to-SQLite-DB

简直神器,界面如下

作者还给出了源代码,在源代码中可以看到数据类型对应的转换

        /// <summary>
/// Used when creating the CREATE TABLE DDL. Creates a single row
/// for the specified column.
/// </summary>
/// <param name="col">The column schema</param>
/// <returns>A single column line to be inserted into the general CREATE TABLE DDL statement</returns>
private static string BuildColumnStatement(ColumnSchema col, TableSchema ts, ref bool pkey)
{
StringBuilder sb = new StringBuilder();
sb.Append("\t[" + col.ColumnName + "]\t"); // Special treatment for IDENTITY columns
if (col.IsIdentity)
{
if (ts.PrimaryKey.Count == && (col.ColumnType == "tinyint" || col.ColumnType == "int" || col.ColumnType == "smallint" ||
col.ColumnType == "bigint" || col.ColumnType == "integer"))
{
sb.Append("integer PRIMARY KEY AUTOINCREMENT");
pkey = true;
}
else
sb.Append("integer");
}
else
{
if (col.ColumnType == "int")
sb.Append("integer");
else
{
sb.Append(col.ColumnType);
}
if (col.Length > )
sb.Append("(" + col.Length + ")");
}
if (!col.IsNullable)
sb.Append(" NOT NULL"); if (col.IsCaseSensitivite.HasValue && !col.IsCaseSensitivite.Value)
sb.Append(" COLLATE NOCASE"); string defval = StripParens(col.DefaultValue);
defval = DiscardNational(defval);
_log.Debug("DEFAULT VALUE BEFORE [" + col.DefaultValue + "] AFTER [" + defval + "]");
if (defval != string.Empty && defval.ToUpper().Contains("GETDATE"))
{
_log.Debug("converted SQL Server GETDATE() to CURRENT_TIMESTAMP for column [" + col.ColumnName + "]");
sb.Append(" DEFAULT (CURRENT_TIMESTAMP)");
}
else if (defval != string.Empty && IsValidDefaultValue(defval))
sb.Append(" DEFAULT " + defval); return sb.ToString();
}

然后就用这个工具把cms的sql server数据库转换成sqlite数据库文件,直接扔进cms项目中。

这样就行了吗?当然还有工作要做,原来项目中操作sql server的类库也要换成sqlite的,sql语句也要做相应的转换,下面就挑一些重点的说一说:

先说数据类型吧:

由于在工具的源代码中,主键不管什么类型的int转成sqlite都用的integer,有需求的可以自己改代码,不过最好要熟悉sqlite的数据类型。下面列出我在项目中所遇到的主要类型转换

sql server c# sqlite c#
int new SqlParameter("@id", SqlDbType.Int,4)  integer new SQLiteParameter("@id", DbType.Int64,8)
nvarchar new SqlParameter("@id", SqlDbType.NVarChar,50) nvarchar new SQLiteParameter("@id", DbType.String,50)
decimal new SqlParameter("@id", SqlDbType.Decimal) numeric new SQLiteParameter("@id", DbType.Decimal)
tinyint new SqlParameter("@id", SqlDbType.TinyInt,1) smallint new SQLiteParameter("@id", DbType.Int16,1)
ntext new SqlParameter("@id", SqlDbType.NText) text new SQLiteParameter("@id", DbType.String)
datetime new SqlParameter("@id", SqlDbType.DateTime) datetime new SQLiteParameter("@id", DbType.DateTime)
Image new SqlParameter("@fs", SqlDbType.Image) Binary new SQLiteParameter("@fs", DbType.Binary)
 

代码数据类型转换之后,就剩调试修改sql语句了,下面列出我在项目中遇到的比较主要的转换

1、top语句,在sqlite中要使用limit,和mysql差不多,例如

  sql:select top 10 * from table_1

  sqlite:select * from table_1 limit 10

2、在插入一条数据后,要获取最新的id

  sql:select @@IDENTITY;

  sqlite:select LAST_INSERT_ROWID();

3、计算时间差

  sql:where datediff(d,field_time,getdate())>=0

  sqlite:where JULIANDAY(datetime('now','localtime'))-JULIANDAY(field_time)>=0

4、分页

  sql:2005以上一般使用ROW_NUMBER()  

    select * from ( select row_number() over(order by id) as rows,* ) as t where rows between PageIndex*PageSize and PageIndex*PageSize+PageSize

  sqlite:用 limit  offset

    select * from table_1 limit PageSize offset (PageIndex- 1) * PageSize 

5、最让人抓狂的是修改表部分的差异

  这一部分单独再写一篇吧

时间不早了,来自老年人的叹息.....

第二天了,附上修改表的文章链接:sqlite修改表、表字段等与sql server的不同之处

C# web项目中sql数据库转sqlite数据库的更多相关文章

  1. C# 动态创建SQL数据库(二) 在.net core web项目中生成二维码 后台Post/Get 请求接口 方式 WebForm 页面ajax 请求后台页面 方法 实现输入框小数多 自动进位展示,编辑时实际值不变 快速掌握Gif动态图实现代码 C#处理和对接HTTP接口请求

    C# 动态创建SQL数据库(二) 使用Entity Framework  创建数据库与表 前面文章有说到使用SQL语句动态创建数据库与数据表,这次直接使用Entriy Framwork 的ORM对象关 ...

  2. Java Web项目中连接Access数据库的配置方法

    本文是对前几天的"JDBC连接Access数据库的几种方式"这篇的升级.因为在做一些小项目的时候遇到的问题,因此才决定写这篇博客的.昨天已经将博客公布了.可是后来经过一些验证有点问 ...

  3. Electron中使用sql.js操作SQLite数据库

    推荐sql.js——一款纯js的sqlite工具. 一.关于sql.js sql.js(https://github.com/kripken/sql.js)通过使用Emscripten编译SQLite ...

  4. 真分布式SolrCloud+Zookeeper+tomcat搭建、索引Mysql数据库、IK中文分词器配置以及web项目中solr的应用(1)

    版权声明:本文为博主原创文章,转载请注明本文地址.http://www.cnblogs.com/o0Iris0o/p/5813856.html 内容介绍: 真分布式SolrCloud+Zookeepe ...

  5. 一个Web项目中实现多个数据库存储数据并相互切换用过吗?

    最近公司一个项目需要连接多个数据库(A和B)操作,根据不同的业务模块查询不同的数据库,因此需要改造下之前的spring-mybatis.xml配置文件以及jdbc.properties配置文件,项目后 ...

  6. 在基于MVC的Web项目中使用Web API和直接连接两种方式混合式接入

    在我之前介绍的混合式开发框架中,其界面是基于Winform的实现方式,后台使用Web API.WCF服务以及直接连接数据库的几种方式混合式接入,在Web项目中我们也可以采用这种方式实现混合式的接入方式 ...

  7. Java Web学习系列——Maven Web项目中集成使用Spring、MyBatis实现对MySQL的数据访问

    本篇内容还是建立在上一篇Java Web学习系列——Maven Web项目中集成使用Spring基础之上,对之前的Maven Web项目进行升级改造,实现对MySQL的数据访问. 添加依赖Jar包 这 ...

  8. asp.net Web项目中使用Log4Net进行错误日志记录

      使用log4net可以很方便地为应用添加日志功能.应用Log4net,开发者可以很精确地控制日志信息的输出,减少了多余信息,提高了日志记录性能.同时,通过外部配置文件,用户可以不用重新编译程序就能 ...

  9. 转 web项目中的web.xml元素解析

    转 web项目中的web.xml元素解析 发表于1年前(2014-11-26 15:45)   阅读(497) | 评论(0) 16人收藏此文章, 我要收藏 赞0 上海源创会5月15日与你相约[玫瑰里 ...

随机推荐

  1. 代码审计-MetInfo 6.0.0 sql注入漏洞

    首先漏洞存在于app\system\message\web\message.class.php文件中,变量{$_M[form][id]} 直接拼接在SQL语句中,且验证码检测函数是在SQL语句查询之后 ...

  2. USACO环绕岛屿Surround the Islands 并查集 枚举暴力

    题目描述 Farmer John has bought property in the Caribbean and is going to try to raise dairy cows on a b ...

  3. opencv::绘制-基本几何

    画线 cv::line(LINE_4\LINE_8\LINE_AA) 画椭圆 cv::ellipse 画矩形 cv::rectangle 画圆 cv::circle 画填充 cv::fillPoly ...

  4. 2.2 C语言_实现数据容器vector(排序功能)

    上一节我们说到我们己经实现了一般Vector可以做到的自动扩充,告诉随机存取,那么现在我们需要完成vector的一个排序的功能. 排序算法我们网上一百度哇~~!很常见的就有8大排序算法: 1.选择排序 ...

  5. 我的Python学习方向-前端辅助-后端框架django学习-浅谈(一)

    初始python,很直观的感受是编译格式多样,代码简介易懂 作为一门通用编程语言,python能编写多种用途的编程语言,当然对于我目前,我的方向便是借助其前端编辑器,实现后台框架的连接学习 1.首先便 ...

  6. Hive On HBase实战

    1.概述 HBase是一款非关系型.分布式的KV存储数据库.用来存储海量的数据,用于键值对操作.目前HBase是原生是不包含SQL操作,虽然说Apache Phoenix可以用来操作HBase表,但是 ...

  7. 聊聊缓存淘汰算法-LRU 实现原理

    前言 我们常用缓存提升数据查询速度,由于缓存容量有限,当缓存容量到达上限,就需要删除部分数据挪出空间,这样新数据才可以添加进来.缓存数据不能随机删除,一般情况下我们需要根据某种算法删除缓存数据.常用淘 ...

  8. 第一章、Python环境搭建

    一.安装Python解释器 Windows下   Python开发环境搭建 1.官网下载: https://www.python.org/downloads/ 2.选择对应的版本 3.双击运行 4.选 ...

  9. Android SDK安装与环境变量的配置(windows系统)

    (一)下载Android SDK压缩包 解压后即可(全英文路径,以免后续出现乱码) (1)下载地址:http://tools.android-studio.org/index.php/sdk

  10. Linux系统 /etc目录下主要配置文件解释

    这些都是比较有实用性的系统配置,收藏下,以备不时之需!以下是etc下重要配置文件解释: 1./etc/hosts  #文件格式: IPaddress hostname aliases #文件功能: 提 ...