C# Sqlite 序列_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > C# Sqlite 序列

C# Sqlite 序列

 2014/5/22 18:57:28  Only Version  博客园  我要评论(0)
  • 摘要:sqlite不能直接创建自定义函数,不能像sqlserver中那样方便创建并使用。不过我们照样可以创建它,创建成功后,我们照样可以随心所欲(比如批量更新等)序列是一个数据库中很常用的操作,在其它关系型数据库创建是相当简单的,但Sqlite不是很方便,因为它不能直接创建自定义函数1.先创建一个表示序列的表:CREATETABLESEQUENCE(SEQ_NAMEVARCHAR(50)NOTNULL,MIN_VALDECIMAL(12,0)NOTNULL,CURRENT_VALDECIMAL(12
  • 标签:C# SQL

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

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

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

 

class="code_img_closed" src="/Upload/Images/2014052218/0015B68B3C38AA5B.gif" alt="" />logs_code_hide('72439f87-dcab-4830-a1a0-95ba2761d73d',event)" src="/Upload/Images/2014052218/2B1B950FA3DF188F.gif" alt="" />
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);
去数据库中查看当前值是否增加

 

 

 

 

 

发表评论
用户名: 匿名