sqlite 不能直接创建自定义函数,不能像 sql server中那样方便创建并使用。不过我们照样可以创建它,创建成功后,我们照样可以随心所欲(比如批量更新等)

序列是一个数据库中很常用的操作,在其它关系型数据库创建是相当简单的,但Sqlite不是很方便,因为它不能直接创建自定义函数

1.先创建一个表示序列的表:

  1. CREATE TABLE SEQUENCE (
  2. SEQ_NAME VARCHAR() NOT NULL,
  3. MIN_VAL DECIMAL(,) NOT NULL,
  4. CURRENT_VAL DECIMAL(,) NOT NULL,
  5. MAX_VAL DECIMAL(,) NOT NULL DEFAULT ,
  6. INCREMENT INT NOT NULL DEFAULT ,
  7. PRIMARY KEY (SEQ_NAME)
  8. );

定义序列的最小值、最大值、步长、序列的名称以及当前值

2.创建触发器

  1. CREATE TRIGGER [SEQ_RESET_TRG]
  2. AFTER UPDATE
  3. ON [SEQUENCE]
  4. FOR EACH ROW
  5. begin
  6. UPDATE SEQUENCE SET CURRENT_VAL=MIN_VAL WHERE CURRENT_VAL-INCREMENT>=MAX_VAL;
  7. end;

当当前值大于最大值时,重置为最小值,达到序号循环使用的目的。

在C#中使用代码创建函数,SqliteHelper 是访问Sqlite的公共类库,在我的《C# Sqlite帮助类》中有介绍。

3.获取当前序列值

  1. [SQLiteFunction(Name = "GetCurrentValue", Arguments = , FuncType = FunctionType.Scalar)]
  2. public class GetCurrentValue : SQLiteFunction
  3. {
  4. public override object Invoke(object[] args)
  5. {
  6. Dictionary<String, String> data = new Dictionary<string, string>();
  7. data.Add("V_SEQ_NAME", args[].ToString());
  8. string sql = "SELECT CURRENT_VAL FROM SEQUENCE WHERE SEQ_NAME = @V_SEQ_NAME; ";
  9. return SqliteHelper.ExecuteScalar(sql,data);
  10. }
  11. }

4.获取下一个序列值

  1. [SQLiteFunction(Name = "GetNextValue", Arguments = , FuncType = FunctionType.Scalar)]
  2. public class GetNextValue : SQLiteFunction
  3. {
  4. public override object Invoke(object[] args)
  5. {
  6. Dictionary<String, String> data = new Dictionary<string, string>();
  7. data.Add("V_SEQ_NAME", args[].ToString());
  8. string sql = "UPDATE SEQUENCE SET CURRENT_VAL = CURRENT_VAL + INCREMENT WHERE SEQ_NAME = @V_SEQ_NAME; ";
  9. SqliteHelper.ExecuteNonQuery(sql, data);
  10. return SqliteHelper.ExecuteScalar(string.Format("SELECT GetCurrentValue('{0}')",args[].ToString()),null);
  11. }
  12. }

5.设置当前序列值

  1. [SQLiteFunction(Name = "SetValue", Arguments = , FuncType = FunctionType.Scalar)]
  2. public class SetValue : SQLiteFunction
  3. {
  4. public override object Invoke(object[] args)
  5. {
  6. Dictionary<String, String> data = new Dictionary<string, string>();
  7. data.Add("V_SEQ_NAME", args[].ToString());
  8. data.Add("V_VALUE", args[].ToString());
  9. string sql = "UPDATE SEQUENCE SET CURRENT_VAL = @V_VALUE WHERE SEQ_NAME= @V_SEQ_NAME; ";
  10. SqliteHelper.ExecuteScalar(sql, data);
  11. return SqliteHelper.ExecuteScalar(string.Format("SELECT GetCurrentValue('{0}')", args[].ToString()), null);
  12. }
  13. }

6.测试:

在序列表SEQUENCE中添加一行数据

定义序列名称为PURCHASE_IN_ORDER,最小值为2000,当前值为2000,最大值值为9999,步长为1.

执行语句:

  1.  string sql = string.Format("Select GetNextValue('PURCHASE_IN_ORDER')");
  2.  SqliteHelper.ExecuteNonQuery(sql,null);
    去数据库中查看当前值是否增加

C# Sqlite 序列的更多相关文章

  1. 【腾讯Bugly干货分享】移动客户端中高效使用SQLite

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57b57f2a0703f7d31b9a3932 作者:赵丰 导语 iOS 程序能 ...

  2. 由一个bug引发的SQLite缓存一致性探索

    问题 我们在生产环境中使用SQLite时中发现建表报“table xxx already exists”错误,但DB文件中并没有该表.后面才发现这个是SQLite在实现过程中的一个bug,而这个bug ...

  3. SQLite剖析之事务处理技术

    前言 事务处理是DBMS中最关键的技术,对SQLite也一样,它涉及到并发控制,以及故障恢复等等.在数据库中使用事务可以保证数据的统一和完整性,同时也可以提高效率.假设需要在一张表内一次插入20个人的 ...

  4. SQLite剖析之数据类型

    许多SQL数据库引擎(除SQLite之外的各种SQL数据库引擎)使用静态.严格的数据类型.对于静态类型,一个值的数据类型由它的容器,即存储这个值的列来决定.SQLite则使用更加通用的动态类型系统.在 ...

  5. 学习SQLite之路(四)

    20160621 更新 参考: http://www.runoob.com/sqlite/sqlite-tutorial.html 1. SQLite   alter命令:不通过执行一个完整的转储和数 ...

  6. SQLite常用点滴总结(转)

    expressionexpr ::=     expr binary-op expr |expr [NOT] like-op expr [ESCAPE expr] |unary-op expr |( ...

  7. SQLite剖析之C/C++接口

    前言 SQLite3是SQLite一个全新的版本,它虽然是在SQLite2的代码基础之上开发的,但是使用了和之前的版本不兼容的数据库格式和API.SQLite3是为了满足以下的需求而开发的:支持UTF ...

  8. Android SQLite数据库使用

    在Android开发中SQLite起着很重要的作用,网上SQLite的教程有很多很多,不过那些教程大多数都讲得不是很全面.本人总结了一些SQLite的常用的方法,借着论坛的大赛,跟大家分享分享的.一. ...

  9. android数据存储之Sqlite(二)

    SQLite学习笔记 前言:上一章我们介绍了sqlite的一些基本知识以及在dos命令下对sqlite进行的增删改查的操作,这一章我们将在android项目中实际来操作sqlite. 1. SQLit ...

随机推荐

  1. win平台,apache通过web访问svn

    上个月用php写一个在线打包lua变成luac,碰到个权限问题.pysvn无法更新.网上搜了好半天都找不到解决方法.最好还是自己解决了. 解决方法也很简单,找到aphache服务,提权限就行了.lin ...

  2. cwRsync window下的跨服务器的文件同步

    cwRsync 是window下的文件同步软件,可以跨服务器运行,第一次运行的时候是全部备份同步,之后的同步采用的是增量同步 这个软件分为服务端和客户端. 服务器是需要同步的文件源, 客户端相当于是备 ...

  3. php 图片添加文字水印 以及 图片合成(微信快码传播)

    1.图片添加文字水印: $bigImgPath = 'backgroud.png'; $img = imagecreatefromstring(file_get_contents($bigImgPat ...

  4. PyAMF and django ForeignKey

    In order to support this, PyAMF needs to provide a synonym mapping between fields. Until then, you c ...

  5. Java知多少(109)数据库更新

    数据库更新操作包括数据表创建.删除.以及数据表记录的增加.删除.修改等操作.如果利用数据 SQL命令实现,则利用Statement对旬的executeUpdate()方法,执行SQL的update语句 ...

  6. 如何对excel进行列查重

    学习了excel函数:countif.表达式:COUNTIF(数据区域,条件),作用:对数据区域内符合条件单元格计数 具体应用 在“姓名”(列A)后插入一列(列B),在B2单元格输入公式“=IF(CO ...

  7. 使用tomcat作为web应用容器时,启用新线程找不到Session的问题

    今天做一个功能,为了快速响应前端,业务完成后,另起了一个线程做一些不影响业务的统计工作,然后立即将业务操作结果返回给前台. 结果在新线程里报空指针找不到request对象.检查了下,我们用的是stru ...

  8. 受限玻尔兹曼机(RBM)学习笔记(二)网络结构

      去年 6 月份写的博文<Yusuke Sugomori 的 C 语言 Deep Learning 程序解读>是囫囵吞枣地读完一个关于 DBN 算法的开源代码后的笔记,当时对其中涉及的算 ...

  9. 配置内存中OLTP文件组提高性能

    在今天的文章里,我想谈下使用内存中OLTP的内存优化文件组来获得持久性,还有如何配置它来获得高性能.在进入正题前,我想简单介绍下使用你数据库里这个特定文件组,内存OLTP是如何获得持久性的. 内存中O ...

  10. JS数组追加数组采用push.apply的坑

    JS数组追加数组没有现成的函数,这么多年我已经习惯了a.push.apply(a, b);这种自以为很酷的,不需要写for循环的写法,一直也没遇到什么问题,直到今天我要append的b是个很大的数组时 ...