目录
解剖SQLSERVER 第三篇  数据类型的实现(译)
首页 数据库 mysql教程 解剖SQLSERVER 第三篇 数据类型的实现(译)

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

Jun 07, 2016 pm 03:20 PM
sqlserver 实现 数据 类型

解剖SQLSERVER 第三篇 数据类型的实现(译) http://improve.dk/implementing-data-types-in-orcamdf/ 实现对SQLSERVER数据类型的解析在OrcaMDF 软件里面是一件比较简单的事,只需要实现ISqlType 接口 public interface ISqlType{ bool IsVariableLength { g

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

 

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

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

<span>public</span> <span>interface</span><span> ISqlType
{
    </span><span>bool</span> IsVariableLength { <span>get</span><span>; }
    </span><span>short</span>? FixedLength { <span>get</span><span>; }
    </span><span>object</span> GetValue(<span>byte</span><span>[] value);
}</span>
登录后复制

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

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

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

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

 

 

SqlInt实现

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

<span>public</span> <span>class</span><span> SqlInt : ISqlType
{
    </span><span>public</span> <span>bool</span><span> IsVariableLength
    {
        </span><span>get</span> { <span>return</span> <span>false</span><span>; }
    }

    </span><span>public</span> <span>short</span>?<span> FixedLength
    {
        </span><span>get</span> { <span>return</span> <span>4</span><span>; }
    }

    </span><span>public</span> <span>object</span> GetValue(<span>byte</span><span>[] value)
    {
        </span><span>if</span> (value.Length != <span>4</span><span>)
            </span><span>throw</span> <span>new</span> ArgumentException(<span>"</span><span>Invalid value length: </span><span>"</span> +<span> value.Length);

        </span><span>return</span> BitConverter.ToInt32(value, <span>0</span><span>);
    }
}</span>
登录后复制

 

相关测试

<span>[TestFixture]
</span><span>public</span> <span>class</span><span> SqlIntTests
{
    [Test]
    </span><span>public</span> <span>void</span><span> GetValue()
    {
        </span><span>var</span> type = <span>new</span><span> SqlInt();
        </span><span>byte</span><span>[] input;

        input </span>= <span>new</span> <span>byte</span>[] { <span>0x5e</span>, <span>0x3b</span>, <span>0x27</span>, <span>0x2a</span><span> };
        Assert.AreEqual(</span><span>707214174</span><span>, Convert.ToInt32(type.GetValue(input)));

        input </span>= <span>new</span> <span>byte</span>[] { <span>0x8d</span>, <span>0xf9</span>, <span>0xaa</span>, <span>0x30</span><span> };
        Assert.AreEqual(</span><span>816511373</span><span>, Convert.ToInt32(type.GetValue(input)));

        input </span>= <span>new</span> <span>byte</span>[] { <span>0x7a</span>, <span>0x4a</span>, <span>0x72</span>, <span>0xe2</span><span> };
        Assert.AreEqual(</span>-<span>495826310</span><span>, Convert.ToInt32(type.GetValue(input)));
    }

    [Test]
    </span><span>public</span> <span>void</span><span> Length()
    {
        </span><span>var</span> type = <span>new</span><span> SqlInt();

        Assert.Throws</span><ArgumentException>(() => type.GetValue(<span>new</span> <span>byte</span>[<span>3</span><span>]));
        Assert.Throws</span><ArgumentException>(() => type.GetValue(<span>new</span> <span>byte</span>[<span>5</span><span>]));
    }
}</span>
登录后复制

 

 

SqlNVarchar 实现

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

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

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

<span>public</span> <span>class</span><span> SqlNVarchar : ISqlType
{
    </span><span>public</span> <span>bool</span><span> IsVariableLength
    {
        </span><span>get</span> { <span>return</span> <span>true</span><span>; }
    }

    </span><span>public</span> <span>short</span>?<span> FixedLength
    {
        </span><span>get</span> { <span>return</span> <span>null</span><span>; }
    }

    </span><span>public</span> <span>object</span> GetValue(<span>byte</span><span>[] value)
    {
        </span><span>return</span><span> Encoding.Unicode.GetString(value);
    }
}</span>
登录后复制

 

相关测试

<span>[TestFixture]
</span><span>public</span> <span>class</span><span> SqlNvarcharTests
{
    [Test]
    </span><span>public</span> <span>void</span><span> GetValue()
    {
        </span><span>var</span> type = <span>new</span><span> SqlNVarchar();
        </span><span>byte</span>[] input = <span>new</span> <span>byte</span>[] { <span>0x47</span>, <span>0x04</span>, <span>0x2f</span>, <span>0x04</span>, <span>0xe6</span>, <span>0x00</span><span> };

        Assert.AreEqual(</span><span>"</span><span>u0447u042fu00e6</span><span>"</span>, (<span>string</span><span>)type.GetValue(input));
    }
}</span>
登录后复制

其他类型的实现

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

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

 

第三篇完

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1662
14
CakePHP 教程
1419
52
Laravel 教程
1313
25
PHP教程
1262
29
C# 教程
1236
24
​sqlserver怎么导入mdf文件 ​sqlserver怎么导入mdf文件 Apr 08, 2024 am 11:41 AM

导入步骤如下:将 MDF 文件复制到 SQL Server 的数据目录(通常为 C:\Program Files\Microsoft SQL Server\MSSQL\DATA)。在 SQL Server Management Studio(SSMS)中,打开数据库并选择“附加”。单击“添加”按钮,选择 MDF 文件。确认数据库名称,点击确定按钮即可。

sqlserver数据库中已存在名为的对象怎么解决 sqlserver数据库中已存在名为的对象怎么解决 Apr 05, 2024 pm 09:42 PM

对于 SQL Server 数据库中已存在同名对象,需要采取以下步骤:确认对象类型(表、视图、存储过程)。如果对象为空,可使用 IF NOT EXISTS 跳过创建。如果对象有数据,使用不同名称或修改结构。使用 DROP 删除现有对象(谨慎操作,建议备份)。检查架构更改,确保没有引用删除或重命名的对象。

sqlserver误删数据库怎么恢复 sqlserver误删数据库怎么恢复 Apr 05, 2024 pm 10:39 PM

若误删 SQL Server 数据库,可采取以下步骤恢复:停止数据库活动;备份日志文件;检查数据库日志;恢复选项:从备份恢复;从事务日志恢复;使用 DBCC CHECKDB;使用第三方工具。请定期备份数据库并启用事务日志以防止数据丢失。

怎么查看sqlserver端口号 怎么查看sqlserver端口号 Apr 05, 2024 pm 09:57 PM

要查看 SQL Server 端口号:打开 SSMS,连接到服务器。在对象资源管理器中找到服务器名称,右键单击它,然后选择“属性”。在“连接”选项卡中,查看“TCP 端口”字段。

sqlserver服务无法启动怎么办 sqlserver服务无法启动怎么办 Apr 05, 2024 pm 10:00 PM

当 SQL Server 服务无法启动时,可采取以下步骤解决:检查错误日志以确定根本原因。确保服务帐户具有启动服务的权限。检查依赖项服务是否正在运行。禁用防病毒软件。修复 SQL Server 安装。如果修复不起作用,重新安装 SQL Server。

iPhone上的蜂窝数据互联网速度慢:修复 iPhone上的蜂窝数据互联网速度慢:修复 May 03, 2024 pm 09:01 PM

在iPhone上面临滞后,缓慢的移动数据连接?通常,手机上蜂窝互联网的强度取决于几个因素,例如区域、蜂窝网络类型、漫游类型等。您可以采取一些措施来获得更快、更可靠的蜂窝互联网连接。修复1–强制重启iPhone有时,强制重启设备只会重置许多内容,包括蜂窝网络连接。步骤1–只需按一次音量调高键并松开即可。接下来,按降低音量键并再次释放它。步骤2–该过程的下一部分是按住右侧的按钮。让iPhone完成重启。启用蜂窝数据并检查网络速度。再次检查修复2–更改数据模式虽然5G提供了更好的网络速度,但在信号较弱

sqlserver安装失败怎么样删除干净 sqlserver安装失败怎么样删除干净 Apr 05, 2024 pm 11:27 PM

如果 SQL Server 安装失败,可通过以下步骤清理:卸载 SQL Server删除注册表项删除文件和文件夹重启计算机

特斯拉机器人进厂打工,马斯克:手的自由度今年将达到22个! 特斯拉机器人进厂打工,马斯克:手的自由度今年将达到22个! May 06, 2024 pm 04:13 PM

特斯拉机器人Optimus最新视频出炉,已经可以在厂子里打工了。正常速度下,它分拣电池(特斯拉的4680电池)是这样的:官方还放出了20倍速下的样子——在小小的“工位”上,拣啊拣啊拣:这次放出的视频亮点之一在于Optimus在厂子里完成这项工作,是完全自主的,全程没有人为的干预。并且在Optimus的视角之下,它还可以把放歪了的电池重新捡起来放置,主打一个自动纠错:对于Optimus的手,英伟达科学家JimFan给出了高度的评价:Optimus的手是全球五指机器人里最灵巧的之一。它的手不仅有触觉

See all articles