解剖SQLSERVER 第三篇  数据类型的实现(译)

http://improve.dk/implementing-data-types-in-orcamdf/

实现对SQLSERVER数据类型的解析在OrcaMDF 软件里面是一件比较简单的事,只需要实现ISqlType 接口

public interface ISqlType
{
bool IsVariableLength { get; }
short? FixedLength { get; }
object GetValue(byte[] value);
}

IsVariableLength 返回数据类型是否是定长的还是变长的。

FixedLength 返回定长数据类型的长度,否则他返回null

数据类型解释器不关心变长字段的长度,输入的字节大小会决定长度

最后,GetValue 将输入字节参数进行解释并将字节解释为相关的.NET对象

SqlInt实现

int类型作为定长类型是非常简单的,能直接使用BitConverter进行转换

public class SqlInt : ISqlType
{
public bool IsVariableLength
{
get { return false; }
} public short? FixedLength
{
get { return ; }
} public object GetValue(byte[] value)
{
if (value.Length != )
throw new ArgumentException("Invalid value length: " + value.Length); return BitConverter.ToInt32(value, );
}
}

相关测试

[TestFixture]
public class SqlIntTests
{
[Test]
public void GetValue()
{
var type = new SqlInt();
byte[] input; input = new byte[] { 0x5e, 0x3b, 0x27, 0x2a };
Assert.AreEqual(, Convert.ToInt32(type.GetValue(input))); input = new byte[] { 0x8d, 0xf9, 0xaa, 0x30 };
Assert.AreEqual(, Convert.ToInt32(type.GetValue(input))); input = new byte[] { 0x7a, 0x4a, 0x72, 0xe2 };
Assert.AreEqual(-, Convert.ToInt32(type.GetValue(input)));
} [Test]
public void Length()
{
var type = new SqlInt(); Assert.Throws<ArgumentException>(() => type.GetValue(new byte[]));
Assert.Throws<ArgumentException>(() => type.GetValue(new byte[]));
}
}

SqlNVarchar 实现

nvarchar 类型也是非常简单的,注意,如果是可变长度我们返回长度的结果是null

ISqlType 接口实现必须是无状态的

GetValue 简单的将输入的字节的数进行转换,这将转换为相关的.NET 类型,这里是string类型

public class SqlNVarchar : ISqlType
{
public bool IsVariableLength
{
get { return true; }
} public short? FixedLength
{
get { return null; }
} public object GetValue(byte[] value)
{
return Encoding.Unicode.GetString(value);
}
}

相关测试

[TestFixture]
public class SqlNvarcharTests
{
[Test]
public void GetValue()
{
var type = new SqlNVarchar();
byte[] input = new byte[] { 0x47, 0x04, 0x2f, 0x04, 0xe6, 0x00 }; Assert.AreEqual("u0447u042fu00e6", (string)type.GetValue(input));
}
}

其他类型的实现

OrcaMDF 软件现在支持12种数据类型,以后将会支持datetime和bit类型,因为这两个类型相比起其他类型有些特殊

其余类型我以后也将会进行实现

第三篇完

解剖SQLSERVER 第三篇 数据类型的实现(译)的更多相关文章

  1. 解剖SQLSERVER 第十篇 OrcaMDF Studio 发布+ 特性重温(译)

    解剖SQLSERVER 第十篇  OrcaMDF Studio 发布+ 特性重温(译) http://improve.dk/orcamdf-studio-release-feature-recap/ ...

  2. 解剖SQLSERVER 第四篇 OrcaMDF里对dates类型数据的解析(译)

    解剖SQLSERVER 第四篇  OrcaMDF里对dates类型数据的解析(译) http://improve.dk/parsing-dates-in-orcamdf/ 在SQLSERVER里面有几 ...

  3. 解剖SQLSERVER 第五篇 OrcaMDF里读取Bits类型数据(译)

    解剖SQLSERVER 第五篇  OrcaMDF里读取Bits类型数据(译) http://improve.dk/reading-bits-in-orcamdf/ Bits类型的存储跟SQLSERVE ...

  4. 解剖SQLSERVER 第十三篇 Integers在行压缩和页压缩里的存储格式揭秘(译)

    解剖SQLSERVER 第十三篇    Integers在行压缩和页压缩里的存储格式揭秘(译) http://improve.dk/the-anatomy-of-row-amp-page-compre ...

  5. 解剖SQLSERVER 第七篇 OrcaMDF 特性概述(译)

    解剖SQLSERVER 第七篇  OrcaMDF 特性概述(译) http://improve.dk/orcamdf-feature-recap/ 时间过得真快,这已经过了大概四个月了自从我最初介绍我 ...

  6. 解剖SQLSERVER 第八篇 OrcaMDF 现在支持多数据文件的数据库(译)

    解剖SQLSERVER 第八篇  OrcaMDF 现在支持多数据文件的数据库(译) http://improve.dk/orcamdf-now-supports-databases-with-mult ...

  7. 解剖SQLSERVER 第六篇 对OrcaMDF的系统测试里避免regressions(译)

    解剖SQLSERVER 第六篇  对OrcaMDF的系统测试里避免regressions (译) http://improve.dk/avoiding-regressions-in-orcamdf-b ...

  8. 解剖SQLSERVER 第十七篇 使用 OrcaMDF Corruptor 故意损坏数据库(译)

    解剖SQLSERVER 第十七篇 使用 OrcaMDF Corruptor 故意损坏数据库(译) http://improve.dk/corrupting-databases-purpose-usin ...

  9. 解剖SQLSERVER 第十一篇 对SQLSERVER的多个版本进行自动化测试(译)

    解剖SQLSERVER 第十一篇    对SQLSERVER的多个版本进行自动化测试(译) http://improve.dk/automated-testing-of-orcamdf-against ...

随机推荐

  1. SVN 集中式版本控制软件

    简介: 目前流行的版本控制软件中,SVN ( 集中式版本控制 ) 算是使用范围更广.且使用时间更早的一款了,现在 git ( 分布式版本控制 ) 更火爆一点. 一.安装svn [root@localh ...

  2. JVM内存模型和性能优化

    JVM内存模型优点 内置基于内存的并发模型:      多线程机制 同步锁Synchronization 大量线程安全型库包支持 基于内存的并发机制,粒度灵活控制,灵活度高于数据库锁. 多核并行计算模 ...

  3. python自我输出源程序

    1.参考相应c程序 s='s=%s%s%s;print s%s(chr(39),s,chr(39),chr(37))';print s%(chr(39),s,chr(39),chr(37)) http ...

  4. linux服务器apache 一个IP,一个端口,建立多个网站的方法。

    找到apache-tomcat-6.0.14\conf\server.xml ,再services 后面添加此段代码: Xml代码 <!-- 此处  新增的项目配置-->  <Ser ...

  5. tomcat 性能优化

    tomcat 性能优化tomcat默认参数是为开发环境制定,而非适合生产环境,尤其是内存和线程的配置,默认都很低,容易成为性能瓶颈. tomcat内存优化linux修改TOMCAT_HOME/bin/ ...

  6. easyui自定义标签 datagrid edit combobox 手动输入保存不上问题解决办法

    使用onEndEdit事件(该事件可以获取到editor对象,onAfterEdit事件获取不到Editor对象) 通过editor拿到输入数据并保存. int ci = 0; for(Column ...

  7. Gray Code

    Gray Code The gray code is a binary numeral system where two successive values differ in only one bi ...

  8. C#引用类型(class)和值类型(struct)

    1. 值参数 当利用值向方法传递参数时,编译程序给实参的值做一份拷贝,并且将此拷贝传递给该方法.被调用的方法不传内存中实参的值,所以使用值参数时,可以保证实际值是安全的. using System; ...

  9. yii隐藏域的使用方法

    <?= $form->field($model, 'time')->textInput()->hiddenInput(['value'=>time()])->lab ...

  10. php图片合成

    <?php//===================== 新建一个新的 GD 图像流并输出图像========================//header("Content-typ ...