解剖SQLSERVER 第三篇 数据类型的实现(译)
解剖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 第三篇 数据类型的实现(译)的更多相关文章
- 解剖SQLSERVER 第十篇 OrcaMDF Studio 发布+ 特性重温(译)
解剖SQLSERVER 第十篇 OrcaMDF Studio 发布+ 特性重温(译) http://improve.dk/orcamdf-studio-release-feature-recap/ ...
- 解剖SQLSERVER 第四篇 OrcaMDF里对dates类型数据的解析(译)
解剖SQLSERVER 第四篇 OrcaMDF里对dates类型数据的解析(译) http://improve.dk/parsing-dates-in-orcamdf/ 在SQLSERVER里面有几 ...
- 解剖SQLSERVER 第五篇 OrcaMDF里读取Bits类型数据(译)
解剖SQLSERVER 第五篇 OrcaMDF里读取Bits类型数据(译) http://improve.dk/reading-bits-in-orcamdf/ Bits类型的存储跟SQLSERVE ...
- 解剖SQLSERVER 第十三篇 Integers在行压缩和页压缩里的存储格式揭秘(译)
解剖SQLSERVER 第十三篇 Integers在行压缩和页压缩里的存储格式揭秘(译) http://improve.dk/the-anatomy-of-row-amp-page-compre ...
- 解剖SQLSERVER 第七篇 OrcaMDF 特性概述(译)
解剖SQLSERVER 第七篇 OrcaMDF 特性概述(译) http://improve.dk/orcamdf-feature-recap/ 时间过得真快,这已经过了大概四个月了自从我最初介绍我 ...
- 解剖SQLSERVER 第八篇 OrcaMDF 现在支持多数据文件的数据库(译)
解剖SQLSERVER 第八篇 OrcaMDF 现在支持多数据文件的数据库(译) http://improve.dk/orcamdf-now-supports-databases-with-mult ...
- 解剖SQLSERVER 第六篇 对OrcaMDF的系统测试里避免regressions(译)
解剖SQLSERVER 第六篇 对OrcaMDF的系统测试里避免regressions (译) http://improve.dk/avoiding-regressions-in-orcamdf-b ...
- 解剖SQLSERVER 第十七篇 使用 OrcaMDF Corruptor 故意损坏数据库(译)
解剖SQLSERVER 第十七篇 使用 OrcaMDF Corruptor 故意损坏数据库(译) http://improve.dk/corrupting-databases-purpose-usin ...
- 解剖SQLSERVER 第十一篇 对SQLSERVER的多个版本进行自动化测试(译)
解剖SQLSERVER 第十一篇 对SQLSERVER的多个版本进行自动化测试(译) http://improve.dk/automated-testing-of-orcamdf-against ...
随机推荐
- 获得URL含有中文出现乱码解决
如: http://www.htmlx.culub/?searchWord=工商代理 当获取链接中所对应searchWord的值时,出现 '%E5%B7%A5%E5%95%86%E4%BB%A3%E7 ...
- c++ 覆盖、重载与隐藏
成员函数被重载的特征:(1)相同的范围(在同一个类中):(2)函数名字相同:(3)参数不同:(4)virtual 关键字可有可无.覆盖是指派生类函数覆盖基类函数,特征是:(1)不同的范围(分别位于派生 ...
- ue4 Worldmachine 结合使用
最近项目需求制作一个场景的远景部分.正好可以尝试使用一下UE4的 Landscape.不过直接在 Editor 里刷地形工作量太大,刷出的地形也不真实,最关键的是 Landscape 的工具并不是那么 ...
- WINDOWS下绑定ARP绑定网关
一.WINDOWS下绑定ARP绑定网关步骤一:在能正常上网时,进入MS-DOS窗口,输入命令:arp -a,查看网关的IP对应的正确MAC地址, 并将其记录下来.注意:如果已经不能上网,则先运行一次命 ...
- 如何搭建lamp(CentOS7+Apache+MySQL+PHP)环境 [转]
在网上搜资料,自己在本地虚拟机上尝试搭建,弄了整整一天一夜,终于弄好了.网上的资料,虽然很多,但大多都是重复的,拿去试了之后,又很多都不能得到正确的结果.最终找到了适合我的linux环境的搭建方式;在 ...
- 利用带关联子查询Update语句更新数据
Update是T-sql中再简单不过的语句了,update table set column=expression [where condition],我们都会用到.但update的用法不仅于此,真 ...
- STL库的内存配置器(allocator)
正在学习中,如果有错,还请多多指教,根据不断的理解,会进行更改,更改之前的样子都会保留下来,记录错误是最大的进步,嗯嗯! 具有次配置力的SGI空间配置器(SGI是STL的一种版本,也有其他的版本) 这 ...
- Android学习 之 ColorStateList按钮文字变色
首先添加一个ColorStateList资源XML文件,XML文件保存在res/color/button_text.xml: <?xml version="1.0" enco ...
- Matlab-Octave中绘制网格图和等高线:mesh 和 surf
x=linspace(-50, 50, 50); % 在x轴上取50点y=linspace(-25, 25, 25); % 在y轴上取25点[xx,yy]=meshgrid(x, y); % xx和y ...
- [转]ORACLE 审计功能
审计是对选定的用户动作的监控和记录,通常用于: u 审查可疑的活动.例如:数据被非授权用户所删除,此时安全管理员可决定对该 数据库的所有连接进行审计,以及对数据库的所有表的成功地或不 ...