C# Sqlite 序列

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

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

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

CREATE TABLE SEQUENCE (
SEQ_NAME VARCHAR(50) NOT NULL,
MIN_VAL DECIMAL(12,0) NOT NULL,
CURRENT_VAL DECIMAL(12,0) NOT NULL,
MAX_VAL DECIMAL(12,0) NOT NULL DEFAULT 1,
INCREMENT INT NOT NULL DEFAULT 1,
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 = 1, 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[0].ToString());
string sql = "SELECT CURRENT_VAL FROM SEQUENCE WHERE SEQ_NAME = @V_SEQ_NAME; ";
return SqliteHelper.ExecuteScalar(sql,data);
}
}

4.获取下一个序列值

[SQLiteFunction(Name = "GetNextValue", Arguments = 1, 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[0].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[0].ToString()),null);
}
}

5.设置当前序列值

 [SQLiteFunction(Name = "SetValue", Arguments = 2, 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[0].ToString());
data.Add("V_VALUE", args[1].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[0].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 序列

时间: 2024-10-14 18:32:07

C# Sqlite 序列的相关文章

C#窗体显示留言时间的方法

本文实例讲述了C#窗体显示留言时间的方法.分享给大家供大家参考.具体分析如下: 运行平台:Vs2012 主要实现例如空间发表说说时间的显示,如:某人在10秒前回复了你这种效果 可用在Web浏览器,窗体,等- 代码如下: namespace test { class Program { static void Main(string[] args) { DateTime now = DateTime.Now; DateTime time = Convert.ToDateTime( "2014-03

学习SQLite之路(四)

20160621 更新 1. SQLite   alter命令:不通过执行一个完整的转储和数据的重载来修改已有的表. 可以使用 ALTER TABLE 语句重命名表,使用 ALTER TABLE 语句还可以在已有的表中添加额外的列. 在 SQLite 中,除了重命名表和在已有的表中添加列,ALTER TABLE 命令不支持其他操作(在其他数据库中可以改变表中列的数据类型,删除表中的列) (1)基本语法: 用来重命名已有的表的 ALTER TABLE 的基本语法如下: ALTER TABLE da

Windows UWP应用使用本地Sqlite和远程Sql(一)

贫猿注册博客园有三年多了,第一次写博客,版式尽量控制的简单点. 本系列文章是简单的记录一下<账簿>本身所运用到的操作本地sqlite和远程sql的代码和结构. 首先的准备工作 安装Sqlite for UWP扩展 从菜单栏找到工具-扩展和更新.在搜索框填写sqlite,在结果里找到“sqlite for Universal App Platform”并安装它. 新建一个8.1的windows 应用,并添加sqlite for windows runtime(8.1)的支持.这时会自动生成SQL

SQLite的SQL语法

SQLite库能够解析大部分标准SQL语言.但它也省去了一些特性而且增加了一些自己的新特性.这篇文档就是试图描写叙述那些SQLite支持/不支持的SQL语法的.查看keyword列表. 例如以下语法表格中,纯文本用蓝色粗体显示.非终极符号为斜体红色.作为语法一部分的运算符用黑色Roman字体表示. 这篇文档仅仅是对SQLite实现的SQL语法的综述,有所忽略.想要得到更具体的信息,參考源码和语法文件“parse.y”. SQLite运行例如以下的语法: ALTER TABLE ANALYZE A

Android Sqlite的操作

1.写一个类继承SQLiteOpenHelper public class MyHelper extends SQLiteOpenHelper { public MyHelper(Context context) { super(context, Const.DB_DBNAME , null, Const.DB_VERSION); // TODO Auto-generated constructor stub } @Override public void onCreate(SQLiteData

SQLite剖析之C/C++接口

前言 SQLite3是SQLite一个全新的版本,它虽然是在SQLite2的代码基础之上开发的,但是使用了和之前的版本不兼容的数据库格式和API.SQLite3是为了满足以下的需求而开发的: * 支持UTF-16编码 * 用户自定义的文本比较方法 * 可以对BLOBs字段建立索引     由于对于C语言应该用什么数据类型来存放UTF-16编码的字符串并没有一致的规范,因此SQLite使用了普通的void*类型来指向UTF-16编码的字符串. 客户端使用过程中可以把void*映射成适合他们的系统的

数据存储——SQLite数据库存储

一.特点 1.存储具有一定结构的数据 2.文件类型  .db 二.SQLite数据库 1.特点 1-轻型的关系型数据库 2-支持多种编程语言 3-适合在移动设备中使用 4-安装文件小 5-支持多个操作系统 6-运行速度快(数据量小) 7-数据库本身是单个文件 2.数据类型 1-整数:INT  .INTEGER: 2-浮点数:FLOAT   .DOUBLE  : 3-字符串文本 ①CHAR,定长的字符串: ②WARCHAR,变长的字符串: ③TEXT,大文本: 4-时间日期:DATE.DATETI

Android 操作SQLite基本用法

在Android开发中SQLite起着很重要的作用,网上SQLite的教程有很多很多,不过那些教程大多数都讲得不是很全面.本人总结了一些SQLite的常用的方法,借着论坛的大赛,跟大家分享分享的. 一.SQLite的介绍 1.SQLite简介 SQLite是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入  式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了.它能够支持 Windows/Linux/Unix等等

Android SQLite的ORM接口实现(一)---findAll和find的实现

最近在看Android的ORM数据库框架LitePal,就想到可以利用原生的SQLite来实现和LitePal类似的ORM接口实现. LitePal有一个接口是这样的: List<Status> statuses = DataSupport.findAll(Status.class); 指定什么类型,就能获取到该类型的数据集合. 这样是很方便,于是想着自己不看它们的实现,自己搞一个出来. 首先想到的就是利用反射和泛型. 利用反射有一个比较好的方式就是注解,读取注解就知道哪些属性是要被赋值的,但