- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在用 C# 构建自定义用户定义类型以用于 SQL CLR。 See this reference .
底层数据可以使用常规带符号的 32 位整数以 4 个字节表示。这是实现:
[Serializable]
[SqlUserDefinedType(Format.UserDefined, IsByteOrdered = true,
IsFixedLength = true, MaxByteSize = 4)]
public struct MyUDT : INullable, IBinarySerialize
{
private int _value;
public int Value
{
get { return _value; }
}
public MyUDT(int value)
: this()
{
_value = value;
}
public override string ToString()
{
return _value.ToString(CultureInfo.InvariantCulture);
}
[SqlMethod(OnNullCall = false)]
public static MyUDT Parse(SqlString s)
{
int i = int.Parse(s.Value);
return new MyUDT(i);
}
public bool IsNull { get; private set; }
public static MyUDT Null
{
get { return new MyUDT { IsNull = true }; }
}
public void Read(BinaryReader r)
{
var bytes = r.ReadBytes(4);
if (BitConverter.IsLittleEndian)
Array.Reverse(bytes);
int i = BitConverter.ToInt32(bytes, 0);
_value = i ^ unchecked((int) 0x80000000);
}
public void Write(BinaryWriter w)
{
int i = _value ^ unchecked((int) 0x80000000);
var bytes = BitConverter.GetBytes(i);
if (BitConverter.IsLittleEndian)
Array.Reverse(bytes);
w.Write(bytes);
}
}
当然,我会添加其他方法使它更有用,但这是编译和发布的最低要求。
我需要确保当此类型用于比较时,例如当它是表中的列时,它被正确排序。既有正值也有负值。
如您所见,我不得不颠倒字节顺序,因为字节顺序是倒序的。我还必须调整字节,使零表示为 0x80000000
,-1 变为 0x7FFFFFFF
。否则值无法正确排序。
但是,这不是 SQL Server 整数的正常工作方式。例如:
SELECT convert(varbinary, -16) -- 0xFFFFFFF0
SELECT convert(varbinary, 16) -- 0x00000010
然而这些排序就好了!所以我只能得出结论,除了原始字节顺序之外,还有其他排序类型。但是我找不到任何方法来在我的 UDT 中控制它。可能吗?
我发现的所有示例都显示如下内容:
public void Read(BinaryReader r)
{
_value = r.ReadInt32();
}
public void Write(BinaryWriter w)
{
w.Write(_value);
}
但那是以一种完全不同的格式写的。它类似于 SQL Server 的格式,但字节序是相反的(1 是 0x01000000
,-16 是 0xF0FFFFFF
)。所以事情变得完全错误。那么这些例子是错误的吗?哪里有错误吗?
我还考虑过使用 Format.Native
并省略自定义序列化。这种方法可行,但我最终得到 5 个字节的值,其中零看起来像 0x8000000000
,-1 看起来像 0x7FFFFFFF00
。它会像我一样自动转换,但它会为 IsNull
bool 字段存储一个额外的字节。它不会接受将其标记为 [NonSerialized]
,并且不会让我删除它。可空性是一项要求,因此它必须存在。
肯定有比必须进行位操作更简单的方法吗?
另一个问题是我的类型不能直接转换为 SQL 中的 int
。虽然,我不确定我是否需要它。
另见 related (but different) question在 DBA.SE 上。
最佳答案
我怀疑您想实现 IComparable 并将 IsByteOrdered 设置为 false。这将通过将零转换为 0x80000000
并将 -1 转换为 07FFFFFFF
来消除玩游戏的需要。
最后我要说的是,我什至不是这方面的初学者。我自己从未做过,但我浏览了这里的文档:http://msdn.microsoft.com/en-us/library/ms131082.aspx
关于c# - 如何正确序列化可排序的 SQLCLR 用户定义类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17892082/
我正在审查顾问 checkin 的一些代码,并注意到他们正在使用 SQLCLR。我没有任何经验,所以我想我会研究它是关于什么的。我注意到他们使用了 Dim cn As New SqlConnectio
我正在尝试将一些现有的 C# 代码转换为 CLR 存储过程。要使用的明显连接字符串是上下文连接(“context connection = true”)。 我遇到的问题是有些事情显然不适用于这种连接类
我正在尝试创建一个可以在 Sql 中使用的 CLR 哈希函数。 我要做的是计算一行的 md5 校验和 值。如何定义函数的输入应该是一行? 例如,Sql原生的checksum函数以'expression
我的任务是获取客户端收到的电子邮件的“已读回执”,并且这些电子邮件是使用 SQLCLR 存储过程发送的。但我无法弄清楚它是如何完成的。您能否告诉我如何为电子邮件配置已读回执? 最佳答案 我原本以为使用
在 SQL-CLR 程序集中.. 有没有一种方法可以让我加载某些数据并可能从 上的数据库中读取数据仅装配负载 ? 假设我有一类用户定义的函数,这些函数使用一些正则表达式,这些表达式必须根据我在数据库中
以防其他人遇到这个问题。 Error: SQL72014: .Net SqlClient Data Provider: ... CREATE ASSEMBLY for assembly 'Assemb
既然 C# 支持可选参数,是否有一种方法可以编写 SQL CLR 存储过程,以便从 Visual Studio 发布时使用在 C# 中定义的可选参数在 SQL Server 中创建存储过程? 过去唯一
我感觉很疯狂,我决定我真的很想用 Python 编写一个可以在 SQL Server 2008 中运行的用户定义函数。我对此很感兴趣,因为我有几千行 PL/Python 函数为 PostgreSQL
我正在用 C# 构建自定义用户定义类型以用于 SQL CLR。 See this reference . 底层数据可以使用常规带符号的 32 位整数以 4 个字节表示。这是实现: [Serializa
使用 SQL Server 2008、Visual Studio 2005、.net 2.0 SP2(支持新的 SQL Server 2008 数据类型)。 我正在尝试编写一个将 DateTime2
这是我看到的一个新现象,我的数据库名称是:MySQLCLR,有一个脚本总是在其中给出这个名称: :setvar DatabaseName "MySQLCLR" 现在突然间,每次我对我的 sqlclr
根据this线程,F# Core 必须经过 SQLCLR 批准才能将程序集标记为 SAFE。这是有计划的吗?还可以吗? 最佳答案 我相信这是可以做到的。但是,F# 核心库是 Microsoft 的专有
在我们的开发服务器最近重新启动期间,SQL Server 开始使用 .NET 4.0 作为 SQLCLR。这意味着在 SQL 中使用 CLR 没有任何作用,或者至少是我通过阅读这些源代码得到的理解:
我正在尝试调用一个 .net 程序集,它包装了来自 Sql Server 的几个 COM 调用(对第三方 dll)。程序集注册正常(我尝试使用不安全和外部访问注册),但是当我运行该过程时出现此错误:
我正在尝试使用 SQLCLR 从 SQL Server 启动 Windows 程序。调用的过程没有报错,但是程序好像没有启动。 知道我可能做错了什么吗? 这是我的程序的 .NET 代码: using
我们有一个第三方 DLL,它可以对源信息的 DataTable 进行操作并生成一些有用的值,我们正在尝试通过 SQLCLR 将其连接起来,以便在 SQL Server 2008 中作为表值 UDF 进
我在 C# 6.0 .NET 3.5 CLR 程序集中编写了一些安全级别为 external_access 的代码。 精简代码: public static readonly DataTable w
我创建了一个调用如下程序集的触发器: CREATE TRIGGER Testrigger ON STATION FOR INSERT AS EXTERNAL NAME assemblytest.[W
我们有一个带有 SQL Server 2005 后端的 .NET 电子商务应用程序。新订单需要一定的“后处理”。这些任务包括发送电子邮件、创建文件、将文件上传到 FTP 服务器以及针对 WCF 数据服
有一些关于如何在 SQL Server 中使用 F# 和 SQLCLR 的博客文章很有帮助:http://richardminerich.com/2015/12/a-safer-way-to-use-
我是一名优秀的程序员,十分优秀!