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

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

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

CREATE TABLE SEQUENCE (
SEQ_NAME VARCHAR() NOT NULL,
MIN_VAL DECIMAL(,) NOT NULL,
CURRENT_VAL DECIMAL(,) NOT NULL,
MAX_VAL DECIMAL(,) NOT NULL DEFAULT ,
INCREMENT INT NOT NULL DEFAULT ,
PRIMARY KEY (SEQ_NAME)
);

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

2.创建触发器

CREATE TRIGGER [SEQ_RESET_TRG]
AFTER UPDATE
ON [SEQUENCE]
FOR EACH ROW
begin
UPDATE SEQUENCE SET CURRENT_VAL=MIN_VAL WHERE CURRENT_VAL-INCREMENT>=MAX_VAL;
end;

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

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

3.获取当前序列值

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

4.获取下一个序列值

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

5.设置当前序列值

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

6.测试:

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

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

执行语句:

 string sql = string.Format("Select GetNextValue('PURCHASE_IN_ORDER')");
 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. swift 附属脚本

    附属脚本是访问对象,集合或序列的快捷方式 struct STest{ let constValue:Int subscript(count:Int)->Int{ return count*con ...

  2. Python Flask UnicodeDecodeError 编码错误解决

    折腾Python做快速Web开发.最后定下来用Flask,相对教程全面. utf8编码上遇到问题,所有文件已经是utf8编码保存,加载css.js等静态文件,如果用GBK编码就正常:用utf8就报Un ...

  3. 完成端口(Completion Port)详解(转)

    手把手叫你玩转网络编程系列之三    完成端口(Completion Port)详解                                                           ...

  4. unity3d 本地数据存储

    using UnityEngine; using System.Collections; //路径工具类 public class PathKit { /** 后缀常量字符 */ public con ...

  5. iOS 模拟器键盘弹出以及中文输入

    1.虚拟键盘的弹出与收起切换: 快捷键:command+shift+K 2.中文输入: Xcode 菜单项 --> Product --> Scheme --> Edit Schem ...

  6. Android Studio开发第四篇版本管理Git(下)

    前面一片介绍了在as下如何关联远程仓库,这篇就介绍在开发过程中怎么应用. 提交+Push 如果本地开发代码有改动了或者你觉得某功能做完了,你打算把改动代码提交到远程仓库,这个时候很简单, 还是在工具栏 ...

  7. Query Object--查询对象模式(上)

    回顾 上两篇文章主要讲解了我对于数据层的Unit Of Work(工作单元模式)的理解,其中包括了CUD的操作,那么今天就来谈谈R吧,文章包括以下几点: 什么是Query Object 基于SQL的实 ...

  8. JAVA & JSON详解

    JSON定义 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类 ...

  9. Android Matirx的简介

    在Android中,对图片的处理需要使用到Matrix类,Matrix是一个3 x 3的矩阵,他对图片的处理分为四个基本类型: 1.Translate————平移X,Y轴变换,而不是移动图形 2.Sc ...

  10. annotation:@Override出现The method of type must override asuperclass解决方案

    原因追踪及解决办法: 1. 查阅资料发现说在jdk1.5下要使用@Override这个annotation必须保证被标注的方法来源于class而不是interface. 2. 即使自己的jdk是1.6 ...