zoukankan      html  css  js  c++  java
  • 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)  
    );
    View Code

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

    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;
    View Code

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

    在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);
            }
        }
    View Code

    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);
            }
        }
    View Code

    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);
            }
        }
    View Code

    6.测试:

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

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

    执行语句:

     string sql = string.Format("Select GetNextValue('PURCHASE_IN_ORDER')");
     SqliteHelper.ExecuteNonQuery(sql,null);
    去数据库中查看当前值是否增加
  • 相关阅读:
    连接mysql遇到的问题
    洛谷 P3369 【模板】普通平衡树(Treap/SBT)
    开博啦
    luogu【P2753】[USACO4.3]字母游戏Letter Game
    luogu【P3377】 【模板】左偏树
    POJ-2251
    HDU-1518
    Coderforces-455A
    UVA-1608
    Coderfocers-551C
  • 原文地址:https://www.cnblogs.com/OnlyVersion/p/3746169.html
Copyright © 2011-2022 走看看