解剖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类型,因为这两个类型相比起其他类型有些特殊
其余类型我以后也将会进行实现
第三篇完

热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

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

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

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

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

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

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

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

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

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

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