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);
    去数据库中查看当前值是否增加
  • 相关阅读:
    Android Studio 单刷《第一行代码》系列 05 —— Fragment 基础
    Android Studio 单刷《第一行代码》系列 04 —— Activity 相关
    Android Studio 单刷《第一行代码》系列 03 —— Activity 基础
    Android Studio 单刷《第一行代码》系列 02 —— 日志工具 LogCat
    Android Studio 单刷《第一行代码》系列 01 —— 第一战 HelloWorld
    IDEA 内网手动添加oracle,mysql等数据源,以及server returns invalid timezone错误配置
    eclipse maven设置
    IntelliJ IDE 常用配置
    eclipse maven 常见问题解决方案
    Maven 安装和配置
  • 原文地址:https://www.cnblogs.com/OnlyVersion/p/3746169.html
Copyright © 2011-2022 走看看