何时使用 SQLCHARS 和何时使用 SQLSTRING?

4

我正在用C#开发一个CLR应用程序。 我遇到了SqlChars类型和SqlString类型。 但是我没有发现它们的区别。 什么时候使用SqlChars,什么时候使用SqlString?

谢谢

3个回答

5

很抱歉当前选定答案中有些数据的重复,但我想提供一点澄清。

首先,简短的回答:

什么时候使用 SqlChars vs SqlString 取决于您的意图。如果您不打算修改输入字符串,请使用 SqlString。如果需要操作输入,请使用 SqlChars。

现在来讲一些我得出这个结论的细节:

我们可以从文档中看到,SqlChars是一个,而SqlString是一个结构体。类与结构体超出了本次回复的范围,但可以说结构体更轻量级。您还可以看到 SqlChars 是可变的(您可以更改它而不一定需要新的内存分配)。我找不到关于 SqlString 大小限制的文档,并且我 没有 使用 SqlString 处理大于 VARCHAR(8000)/NVARCHAR(4000) 的数据时遇到过任何问题。如果您遇到了问题,请确保 CLR 代码具有 MaxByteSize = -1。

以下信息来自SQL 类型的 MSDN 文档。

SqlChars 是一个可变的引用类型,它包装了 Char 数组或 SqlString 实例。

结构体

SqlString - 表示要存储在数据库中或从数据库中检索的可变长度字符流。SqlString 具有与其对应的 .NET Framework 字符串数据类型不同的基础数据结构。


感谢添加这个澄清。补充一下,SqlString与SqlChars具有相同的2 GB限制。在NVARCHAR(1-4000)-> SqlString或NVARCHAR(MAX)-> SqlChars之间没有固有的映射。这取决于SQL包装对象的定义方式。默认映射是我刚才提到的,而使用SqlFacet MaxSize = -1获取SqlString的NVARCHAR(MAX)的能力纯粹是Visual Studio生成SQL包装对象的构造。但是,您可以手动创建它或修改Visual Studio创建的内容,以便对NVARCHAR(1-4000)进行SqlChars操作。 - Solomon Rutzky
此外,关于“意图”,在处理 LOB(http://technet.microsoft.com/en-us/library/ms131065.aspx)的 MSDN 页面上也有这样一句话:“这些类型允许将 LOB 值从数据库流式传输到公共语言运行时 (CLR) 例程,而不是将整个值复制到托管空间中”。因此,假设我有 10k 的文本,但想要执行类似 RegEx 的操作,需要一个字符串,那么是仍然使用 SqlChars 立即执行 ToString(因为我随后在托管空间中拥有它的副本),还是只使用 SqlString 并省略一步呢? - Solomon Rutzky
我不知道流式传输的能力,也从未使用过。流式传输的优点在于当你需要将数据从一个地方移动/转换到另一个地方,并且不需要一次性获取所有内容时。由于执行RegEx需要所有数据,我认为流式传输并没有什么帮助。如果你要将数据从SQL移动到文件(来自MS示例),它可以帮助减少内存压力,特别是当你有一个1GB的文件时,因为你不需要一次性将所有1GB的数据都放入内存中。对于RegEx,我认为SqlString就足够了,但测试两种方法也无妨。 - Bennett Dill
这是一个指向LOB示例的链接,看起来需要大量工作,但如果您有简单地推动大型对象,那么它可能会帮助减轻内存压力。否则,我可能会避免使用它。里面的评论让我开心:“从数据库中检索LOB的最佳方法是获取块吗”。http://msftengprodsamples.codeplex.com/SourceControl/latest#Katmai_Trunk/Programmability/CLR/HandlingLOBUsingCLR/CS/HandlingLOBUsingCLR/LargeObjectBinary.cs - Bennett Dill
+1 为SQLString和最大长度错误信息的纠正。 - Martin Smith

4

-- SQL String是.net框架中的一个sqltype。它表示一个可变长度的字符流,用于在数据库中存储或检索。

-- SQLChar是一个可变引用类型,它包装了一个字符数组或SqlString实例。 SqlChar是一个类。 并且你发现的是正确的,即sqlstring仅限于nvarchar(4000),而sqlchars是nvarchar(max)。 (但我们可以使用SqlFacet属性定义参数和返回类型的大小、精度和比例。)


-2

请允许我引用Alastair先生的话:SQLCHAR对系统内存资源的要求较低,因为它不需要像SQLSTRING一样连续的块。


你能引用一下相关的参考资料吗?我认为 SqlString 应该是不可变的,就像大多数字符串一样。而 SqlChar 更像是 StringBuilder,数据可以在保留大小未超限的情况下进行更改,这与不可变字符串不同,任何更改都需要新的分配空间。 - Bennett Dill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接