本文实例讲述了C# SQLite序列操作实现方法。分享给大家供大家参考,具体如下:
sqlite 不能直接创建自定义函数,不能像 sql server中那样方便创建并使用。不过我们照样可以创建它,创建成功后,我们照样可以随心所欲(比如批量更新等)
序列是一个数据库中很常用的操作,在其它关系型数据库创建是相当简单的,但Sqlite不是很方便,因为它不能直接创建自定义函数
1.先创建一个表示序列的表:
1
2
3
4
5
6
7
8
|
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.创建触发器
1
2
3
4
5
6
7
|
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.获取当前序列值
1
2
3
4
5
6
7
8
9
10
11
|
[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.获取下一个序列值
1
2
3
4
5
6
7
8
9
10
11
12
|
[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.设置当前序列值
1
2
3
4
5
6
7
8
9
10
11
12
13
|
[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.
执行语句:
1
2
|
string sql = string .Format( "Select GetNextValue('PURCHASE_IN_ORDER')" );
SqliteHelper.ExecuteNonQuery(sql, null );
|
去数据库中查看当前值是否增加
希望本文所述对大家C#程序设计有所帮助。