STSdb数据库的实现使用类
STSdb 3.5是一个开源的key-value存储形式的数据库,它是用微软.net框架C#语言编写的。STSdb 3.5尤其使用于紧急任务或实时系统,如:股市交易,电子通信,实验室数据等,它的主要功能是能够处理大量数据流。
下面用C#对stsdb3.5进行简单封装,使之可以实现数据的简单CURD功能。
需要用到的依赖包:
stsdb3.5 http://stssoft.com/downloads/
Newtonsoft.JSON https://www.newtonsoft.com/json
先实现一个数据保存类对象, 该对象可以有判断数据是否超时的功能,在必要的时候可以用到:
/// <summary>
/// STSdb3的数据对象
/// </summary>
/// <typeparam name="T"></typeparam>
class Stsdb3Data<T>
{
/// <summary>
/// 唯一标识,不能为空
/// </summary>
public string Key { get; set; }
/// <summary>
/// 数据值
/// </summary>
public T Value { get; set; } private DateTime _dtc = DateTime.Now;
/// <summary>
/// 构造时间
/// </summary>
public DateTime dtc {
get{return _dtc;}
set{_dtc =value;}
} private int _expiry = 0;
/// <summary>
/// 超时时间(秒), 默认0永不超时
/// </summary>
public int expiry{
get {return _expiry;}
set {_expiry = value;}
} /// <summary>
/// 构造函数
/// </summary>
public Stsdb3Data()
{ }
/// <summary>
/// 构造函数,提供默认值
/// </summary>
/// <param name="Value"></param>
public Stsdb3Data(T Value)
{
this.Value = Value;
} /// <summary>
/// 判断是否已经超时
/// </summary>
/// <returns></returns>
public bool IsExpired()
{
if ( this.expiry<=0 )
{
return false;
}
return (DateTime.Now - this.dtc).Seconds > this.expiry;
}
}
操作服务类Service:
/// <summary>
/// STSdb3本地NoSQL数据库实现类
/// <para>author: lcs 1125271180@qq.com</para>
/// </summary>
public class Stsdb3Service
{
public static string dbpath { get; set; } public Stsdb3Service()
{
if (string.IsNullOrEmpty(dbpath))
{
dbpath = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + @"\vs2008\stsdb3.dat";
}
} /// <summary>
/// 保存数据对象
/// </summary>
/// <typeparam name="T">数据对象包含的数据</typeparam>
/// <param name="key"></param>
/// <param name="data">数据对象</param>
/// <param name="tabname">保存表名</param>
/// <param name="expiry">超时时长(秒)</param>
public void Put<T>(string key, T t, string tabname, int expiry)
{
using (StorageEngine engine = StorageEngine.FromFile(dbpath))
{
var locator = new Locator(tabname);
var table = engine.Scheme.CreateOrOpenXTable<string, string>(locator);
var data = new Stsdb3Data<T>() { Key=key,Value=t,expiry=expiry};
table[key] = JsonConvert.SerializeObject(data);
table.Commit();
engine.Scheme.Commit();
table.Close();
engine.Dispose();
}
}
/// <summary>
/// 保存数据对象
/// </summary>
/// <typeparam name="T">数据对象包含的数据</typeparam>
/// <param name="key"></param>
/// <param name="t">数据对象</param>
/// <param name="tabname">保存表名</param>
public void Put<T>(string key, T t, string tabname)
{
Put<T>(key, t, tabname, 0);
} /// <summary>
/// 获取数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <param name="tabname"></param>
/// <returns></returns>
public T Get<T>(string key, string tabname)
{
string json = string.Empty;
T rest = default(T);
using (StorageEngine engine = StorageEngine.FromFile(dbpath))
{
var locator = new Locator(tabname);
var table = engine.Scheme.CreateOrOpenXTable<string, string>(locator);
try
{
var item = table.FirstOrDefault(x => x.Key == key);
json = item.Record != null ? item.Record : json;
var data = JsonConvert.DeserializeObject<Stsdb3Data<T>>(json);
if (data.IsExpired())
{
Delete(key, tabname); //删除无效的历史数据
}
else
{
rest = data.Value;
}
}
catch
{
//
}
table.Close();
engine.Dispose();
} return rest;
} /// <summary>
/// 删除数据
/// </summary>
/// <param name="key"></param>
/// <param name="tabname"></param>
public void Delete(string key, string tabname)
{
using (StorageEngine engine = StorageEngine.FromFile(dbpath))
{
var locator = new Locator(tabname);
var table = engine.Scheme.CreateOrOpenXTable<string, string>(locator);
if (table != null)
{
table.Delete(key);
table.Commit();
table.Close();
}
engine.Dispose();
}
}
}
在以上两个类都实现后,就可以进行测试了.
测试字符串代码如下:
// 初始化
Stsdb3Service service = new Stsdb3Service();
// 保存字符串
string key = "vs2008:k001";
string val = "我的数据 vs2008";
string tabname = "vs2008";
service.Put<string>(key, val, tabname);
// 读取保存的字符串
string rest = service.Get<string>(key, tabname);
MessageBox.Show("" + rest); //Delete
service.Delete(key, tabname); //再次读取
rest = service.Get<string>(key, tabname); if (rest != null)
{
MessageBox.Show("" + rest);
}
else
{
MessageBox.Show("not any value");
}
测试自定义对象:
Stsdb3Service service = new Stsdb3Service();
//测试对象
string bar = "6912345";
Book book = new Book() { bar = bar, name = "书本名", dtc = DateTime.Now };
string bookTabname = "books";
//保存对象
service.Put<Book>(book.bar, book, bookTabname);
// 读取对象
Book rest = service.Get<Book>(bar, bookTabname);
if (rest == null)
{
MessageBox.Show("rest: no book ...");
}
else
{
MessageBox.Show("rest: book: " + JsonConvert.SerializeObject(rest));
}
补充Book类对象:
public class Book
{
public string bar { get; set; }
public string name { get; set; }
public DateTime dtc { get; set; }
}
STSdb数据库的实现使用类的更多相关文章
- Oracle数据库中调用Java类开发存储过程、函数的方法
Oracle数据库中调用Java类开发存储过程.函数的方法 时间:2014年12月24日 浏览:5538次 oracle数据库的开发非常灵活,不仅支持最基本的SQL,而且还提供了独有的PL/SQL, ...
- MyEclipse从数据库反向生成实体类之Hibernate方式 反向工程
前文: hibernate带给我们的O/RMapping思想是很正确的,即从面相对象的角度来设计工程中的实体对象,建立pojo,然后在编写hbm.xml映射文件来生成数据表.但是在实际开发中,往往我们 ...
- 使用T4为数据库自动生成实体类
T4 (Text Template Transformation Toolkit) 是一个基于模板的代码生成器.使用T4你可以通过写一些ASP.NET-like模板,来生成C#, T-SQL, XML ...
- MyEclipse数据库反向生成实体类
MyEclipse数据库反向生成实体类 “计应134(实验班) 凌豪” 当我们在开发项目涉及到的表太多时,一个一个的写JAVA实体类很是费事.然而强大的MyEclipse为我们提供简便的方法:数据库反 ...
- J2EE进阶(十五)MyEclipse反向工程实现从数据库反向生成实体类之Hibernate方式
J2EE进阶(十五)MyEclipse反向工程实现从数据库反向生成实体类之Hibernate方式 反向工程又称逆向工程. 开发项目涉及到的表太多,一个一个的写JAVA实体类很是费事.MyEcl ...
- 14.翻译系列:从已经存在的数据库中生成上下文类和实体类【EF 6 Code-First系列】
原文链接:https://www.entityframeworktutorial.net/code-first/code-first-from-existing-database.aspx EF 6 ...
- 自定义tt文本模板实现MySql指数据库中生成实体类
自定义tt文本模板实现MySql指数据库中生成实体类 1.在项目中依次点击“添加”/“新建项”,选择“文本模板”,输入名称后点击添加. 2.在Base.tt中添加如下代码. <#@ templa ...
- C#连接操作MySQL数据库详细步骤 帮助类等(二次改进版)
最近准备写一个仓库管理的项目 客户要求使用C#编写MySQL存储数据 为了方便,整理了数据库操作的工具类 首先在项目App.config 文件下添加节点 <connectionStrings&g ...
- 针对SQLServer数据库的通用访问类
Web.config中代码 <configuration> <connectionStrings> <add name="connString" co ...
随机推荐
- 【论文速读】Pan He_ICCV2017_Single Shot Text Detector With Regional Attention
Pan He_ICCV2017_Single Shot Text Detector With Regional Attention 作者和代码 caffe代码 关键词 文字检测.多方向.SSD.$$x ...
- tiny6410 启动参数
baudrate=115200 bootargs=noinitrd root=/dev/nfs nfsroot=192.168.1.116:/home/suxuandong/Documents/com ...
- redis 在 php 中的应用(string篇)
本文为我阅读了 redis参考手册 之后结合 博友的博客 编写,注意 php_redis 和 redis-cli 的区别(主要是返回值类型和参数用法) 目录: string(字符串) SET SETN ...
- 五一培训 DAY1
DAY1 枚举 例题1 题解: 例题2 题解: 例题3 题解: vis[ ]判断是否为素数,pri[ ]储存素数 例题4 题解: 例题5 题解: PS: i < 1<<n ...
- JavaScript之事件的绑定与移除
对于事件的绑定的方法有多种多样,但是在解除绑定事件的时候,就要注意使用的是那种绑定事件的方法,因为不同的绑定方法所对应的解除事件是不同的. 1. 原始写法 1.1 绑定事件:对象.事件=事件处理函数 ...
- 使用GoldenGate EVENTACTIONS执行数据的实时触发和定制化
Oracle GoldenGate不仅可以在线实时同步数据(包括增量和存量),也内置有一套事件触发流程,允许用户根据某张表某条记录的某个特殊字段值,触发相应的自定义执行流程,比如接收到某个银行账号的大 ...
- Python爬虫与一汽项目【一】爬取中海油,邮政,国家电网问题总结
项目介绍 中国海洋石油是爬取的第一个企业,之后依次爬取了,国家电网,中国邮政,这三家公司的源码并没有多大难度, 采购信息地址: 国家电网电子商务平台 http://ecp.sgcc.com.cn/pr ...
- python 字典嵌套字典赋值异常
针对dict中 嵌套dict 出现复制异常 lists={} test=['s1','s2','s3'] data = {'value': '',} for i in range(2): lists[ ...
- Client does not support authentication
Navicat 11 连MySQL 8.0.16 报 Client does not support authentication........ 解决: alter user 'fabu'@'%' ...
- js 获取链接参数的方法
方法1: /** * 获取链接上的参数 * string 需要获取的参数名称 */ var getHref = function(string){ var reg = new RegExp(" ...