C# web项目中sql数据库转sqlite数据库
最近做了一个小网站,用到了一个使用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数据库的更多相关文章
- C# 动态创建SQL数据库(二) 在.net core web项目中生成二维码 后台Post/Get 请求接口 方式 WebForm 页面ajax 请求后台页面 方法 实现输入框小数多 自动进位展示,编辑时实际值不变 快速掌握Gif动态图实现代码 C#处理和对接HTTP接口请求
C# 动态创建SQL数据库(二) 使用Entity Framework 创建数据库与表 前面文章有说到使用SQL语句动态创建数据库与数据表,这次直接使用Entriy Framwork 的ORM对象关 ...
- Java Web项目中连接Access数据库的配置方法
本文是对前几天的"JDBC连接Access数据库的几种方式"这篇的升级.因为在做一些小项目的时候遇到的问题,因此才决定写这篇博客的.昨天已经将博客公布了.可是后来经过一些验证有点问 ...
- Electron中使用sql.js操作SQLite数据库
推荐sql.js——一款纯js的sqlite工具. 一.关于sql.js sql.js(https://github.com/kripken/sql.js)通过使用Emscripten编译SQLite ...
- 真分布式SolrCloud+Zookeeper+tomcat搭建、索引Mysql数据库、IK中文分词器配置以及web项目中solr的应用(1)
版权声明:本文为博主原创文章,转载请注明本文地址.http://www.cnblogs.com/o0Iris0o/p/5813856.html 内容介绍: 真分布式SolrCloud+Zookeepe ...
- 一个Web项目中实现多个数据库存储数据并相互切换用过吗?
最近公司一个项目需要连接多个数据库(A和B)操作,根据不同的业务模块查询不同的数据库,因此需要改造下之前的spring-mybatis.xml配置文件以及jdbc.properties配置文件,项目后 ...
- 在基于MVC的Web项目中使用Web API和直接连接两种方式混合式接入
在我之前介绍的混合式开发框架中,其界面是基于Winform的实现方式,后台使用Web API.WCF服务以及直接连接数据库的几种方式混合式接入,在Web项目中我们也可以采用这种方式实现混合式的接入方式 ...
- Java Web学习系列——Maven Web项目中集成使用Spring、MyBatis实现对MySQL的数据访问
本篇内容还是建立在上一篇Java Web学习系列——Maven Web项目中集成使用Spring基础之上,对之前的Maven Web项目进行升级改造,实现对MySQL的数据访问. 添加依赖Jar包 这 ...
- asp.net Web项目中使用Log4Net进行错误日志记录
使用log4net可以很方便地为应用添加日志功能.应用Log4net,开发者可以很精确地控制日志信息的输出,减少了多余信息,提高了日志记录性能.同时,通过外部配置文件,用户可以不用重新编译程序就能 ...
- 转 web项目中的web.xml元素解析
转 web项目中的web.xml元素解析 发表于1年前(2014-11-26 15:45) 阅读(497) | 评论(0) 16人收藏此文章, 我要收藏 赞0 上海源创会5月15日与你相约[玫瑰里 ...
随机推荐
- Python3数据分析与挖掘建模实战 ☝☝☝
Python3数据分析与挖掘建模实战 Python数据分析简介 Python入门 运行:cmd下"python hello.py" 基本命令: 第三方库 安装 Windows中 p ...
- python学习(索引/切片)
一.索引 1.索引值从左到右-->从0开始,索引值从右到左-->从-1开始 取值格式var[index] >>> name = "xinfangshuo&quo ...
- Python_散点图与折线图绘制
在数据分析的过程中,经常需要将数据可视化,目前常使用的:散点图 折线图 需要import的外部包 一个是绘图 一个是字体导入 import matplotlib.pyplot as plt fro ...
- 服务器端 SOCKET 编程
使用 Socket 的程序在使用 Socket 之前必须调用 WSAStartup() 函数, 此函数在应用程序中用来初始化 Windows Socket DLL, 只有此函数调用成功后,应用程序才可 ...
- spring源码系列8:AOP源码解析之代理的创建
回顾 首先回顾: JDK动态代理与CGLIB动态代理 Spring中的InstantiationAwareBeanPostProcessor和BeanPostProcessor的区别 我们得知 JDK ...
- 我家很管事的猫——mycat初步部署实践与问题排查
mycat,阿里出品的mysql中间件,提供读写分离和分库分表方案.项目中主要使用的是其读写分离功能. [如何部署?] 本文只采用并测试了双主从模式,配置看这一篇足矣: https://www.cnb ...
- vue——前端跨域
***针对的是不同域名.不同协议的跨域: 1.找到config文件中开发环境的配置文件——dev.env.js,在里面将要跨域的域名配置进去 2.找到config文件中线上环境的配置文件——prod. ...
- sql优化提速整理
sql优化提速整理 场景描述 在我们实际开发中,随着业务的不断增加,数据量也在不断的攀升,这样就离不开一个问题:数据查询效率优化 根据自己的以往实际项目工作经验和学习所知,现在对SQL查询优化做一个简 ...
- Spring Cloud 网关服务 zuul 三 动态路由
zuul动态路由 网关服务是流量的唯一入口.不能随便停服务.所以动态路由就显得尤为必要. 数据库动态路由基于事件刷新机制热修改zuul的路由属性. DiscoveryClientRouteLocato ...
- 用MATLAB绘制折线图,x轴为字符串,并旋转一定的角度!!!
先上代码,然后再一行一行解释: x=1:37; %这一行其实一开始,写的时候是没有的,后来需要给X轴上规定几个刻度才加上的 plot(x,Y,'linewidth',2); %以x为自变量,y为因变量 ...