欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C# SQLite序列操作实现方法详解

程序员文章站 2023-12-02 23:00:04
本文实例讲述了c# sqlite序列操作实现方法。分享给大家供大家参考,具体如下: sqlite 不能直接创建自定义函数,不能像 sql server中那样方便创建并使用...

本文实例讲述了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中添加一行数据

C# SQLite序列操作实现方法详解

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

执行语句:

string sql = string.format("select getnextvalue('purchase_in_order')");
sqlitehelper.executenonquery(sql,null);

去数据库中查看当前值是否增加

更多关于c#相关内容感兴趣的读者可查看本站专题:《c#常见数据库操作技巧汇总》、《c#常见控件用法教程》、《c#窗体操作技巧汇总》、《c#数据结构与算法教程》、《c#面向对象程序设计入门教程》及《c#程序设计之线程使用技巧总结

希望本文所述对大家c#程序设计有所帮助。