系列目录
一、MeayunDB表配置
首先需要在配置文件config.xml中配置表,MeayunDB标准版没有提供自动化创建表的工具,企业版和数据中心版支持自动化创建,而不是手动修改配置文件
<?xml version="1.0" encoding="utf-8" ?> <tables> <!--配置内存数据表,primary为表的主索引,唯一确定一条记录,name为表名--> <table primary="id" name="tb_object_0002"> <!--数据列属性,name为列名,type为列类型:Bool,Byte,Int16, Date,Int32,Time, Int64,Double,String--> <column name="id" type="int64"></column> <column name="F1_0002" type="string"></column> <column name="F2_0002" type="string"></column> <column name="F3_0002" type="string"></column> <column name="F4_0002" type="string"></column> <column name="F5_0002" type="string"></column> <column name="F6_0002" type="string"></column> <column name="F7_0002" type="string"></column> <column name="F8_0002" type="date"></column> <indexes> <!--数据表索引,name为索引名,type为索引类型,keys为创建索引的数据列,有先后顺序之分--> <index name="securities" type="Dictionary" keys="F1_0002"></index> </indexes> </table> <table primary="id" name="tb_object_0001"> <column name="id" type="int64"></column> <column name="F1_0001" type="string"></column> <column name="F2_0001" type="date"></column> <column name="F3_0001" type="double"></column> <column name="F4_0001" type="double"></column> <column name="F5_0001" type="double"></column> <column name="F6_0001" type="double"></column> <column name="F7_0001" type="double"></column> <column name="F8_0001" type="double"></column> <indexes> <index name="quotation" type="DictionarySortedList" keys="F1_0001,F2_0001"></index> </indexes> </table> <table primary="F1" name="Test"> <column name="F1" type="int64"></column> <column name="F2" type="int64"></column> <column name="F3" type="int64"></column> <column name="F4" type="int64"></column> <column name="F5" type="int64"></column> <indexes> <index name="T1" type="Dictionary" keys="F1"></index> <index name="T2" type="Dictionary2" keys="F1,F2"></index> <index name="T3" type="Dictionary2Bucket" keys="F1,F2"></index> <index name="T4" type="DictionaryBucket" keys="F1"></index> <index name="T5" type="DictionarySortedBucket" keys="F1,F2"></index> <index name="T6" type="DictionarySortedList" keys="F1,F2"></index> <index name="T7" type="SortedBucket" keys="F1"></index> <index name="T8" type="SortedDictionary" keys="F1,F2"></index> <index name="T9" type="SortedDictionaryBucket" keys="F1,F2"></index> <index name="T10" type="SortedList" keys="F1"></index> </indexes> </table> </tables>
索引可以是如下类型:
二、索引使用
using System; using System.Collections.Generic; using System.Linq; using System.Text; using MeayunDB; namespace Domain { /// <summary> /// 计算上交所股票成交额 /// </summary> [Command("{\"action\":\"Amount\"}", "计算上交所股票成交额")] public class Amount : BaseAction { public override JsonObject DoAction(JsonTree parameters) { // 构造返回结果,此action返回表,包含三列 Table result = new Table(); result.Append("证券代码", DataType.String); result.Append("证券名称", DataType.String); result.Append("成交额", DataType.Double); // 按索引名取索引,需要在config.xml配置表和索引,请参考config.xml配置文件 Dictionary<string> securities = Indexes.Current["securities"] as Dictionary<string>; DictionarySortedList<string, int> quotation = Indexes.Current["quotation"] as DictionarySortedList<string, int>; // 查询股票代码,访问Dictionary的接口 List<int> pointers = securities.Find(); if (pointers.IsNull()) return null; // 枚举股票代码 foreach (int pointer in pointers) { // 取当前枚举的股票代码 string securityCode = securities.Get<string>("F1_0002", pointer); // 取当前股票的所有行情记录 List<int> list = quotation.Find(securityCode, true); if (list.IsNull()) continue; result.Add<string>("证券代码", securityCode); result.Add<string>("证券名称", securities.Get<string>("F2_0002", pointer)); // 成交额求和 result.Add<double>("成交额", quotation.Sum("F8_0001", list.GetEnumerator())); } // 转换为Json对象 return result.ToJsonTree(); } } }
通过Indexes和索引名访问索引容器,索引容器中提供相应的数据查询接口。
索引基类提供的接口,可以通过MeayunDB.dll查看,也可以从下载安装包中查看MeayunDB API.chm接口文档。
using System; using System.Collections.Generic; namespace MeayunDB { public abstract class BaseIndex { public BaseIndex(); public BaseIndex(string name, string keys); public int Count { get; set; } public string[] Keys { get; } public string Name { get; } public virtual double Avg(string field, IEnumerator<int> enumerator); public IEnumerator<int> Filter(); public virtual IEnumerator<int> Filter(JsonTree parameters); public IEnumerator<int> Filter(string where); public virtual IEnumerator<int> Filter(IEnumerator<int> enumerator, string where); public IEnumerator<int> Filter(string on, string where); public virtual object Get(string name, int pointer); public virtual TValue Get<TValue>(string name, int pointer); public virtual BaseColumn GetValue(string field, IEnumerator<int> enumerator); public virtual Column<TValue> GetValue<TValue>(string field, IEnumerator<int> enumerator); public Table Query(); public virtual Table Query(IEnumerator<int> enumerator); public Table Query(JsonTree parameters); public Table Query(string where); public Table Query(string[] fields); public virtual Table Query(IEnumerator<int> enumerator, string where); public virtual Table Query(IEnumerator<int> enumerator, string[] fields); public Table Query(string on, string where); public Table Query(string where, string[] fields); public virtual Table Query(IEnumerator<int> enumerator, string where, string[] fields); public Table Query(string on, string where, string[] fields); public virtual double Sum(string field, IEnumerator<int> enumerator); } }
在具体业务开发中,开发人员只要继承BaseAction,业务均在DoAction中实现。开发简单,易于使用。开发完毕后,需要把action提交到MeayunDB的脚本目录中。
如下图,我启动的MeayunDB的脚本目录为scripts,把开发完毕的c#业务代码拷贝到scripts目录,重启服务,相应的业务就嵌入到数据库了。
MeayunDB的Action可以和关系型数据库的存储过程进行类比,Action就好比关系型数据库中的存储过程,通过Action名称和一些参数就能访问Action。
三、客户端访问
/*
* Copyright (C) 2012-2013 上海密云信息科技有限公司 All rights reserved.
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Diagnostics;
using System.Data.SqlClient;
using System.Data;
using Driver; namespace RPC
{
class Program
{
/// <summary>
/// 首先添加Driver.dll的引用,然后在应用程序目录添加servers.xml
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
// 启动驱动器
Global.Start();// 构造请求参数
JsonTree request = new JsonTree();
request.AddJsonString("action", "Amount");