Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 何时使用sqlchars和何时使用sqlstring?_C#_Sql Server_Clr - Fatal编程技术网

C# 何时使用sqlchars和何时使用sqlstring?

C# 何时使用sqlchars和何时使用sqlstring?,c#,sql-server,clr,C#,Sql Server,Clr,我正在用c#开发一个CLR应用程序。 我遇到了SqlChars类型和SqlString。 但是我没有发现它们之间的区别。 何时使用SqlChars和何时使用SqlString 感谢--SQL字符串是.net framework中的一种sqltype。它表示要存储在数据库中或从数据库中检索的可变长度字符流 --SQLChar是一种可变引用类型,用于包装Char数组或SqlString实例。 SqlChar是一个类。 你发现的是正确的,sqlstring限制为nvarchar(4000),sqlch

我正在用c#开发一个CLR应用程序。 我遇到了SqlChars类型和SqlString。 但是我没有发现它们之间的区别。 何时使用SqlChars和何时使用SqlString

感谢--SQL字符串是.net framework中的一种sqltype。它表示要存储在数据库中或从数据库中检索的可变长度字符流

--SQLChar是一种可变引用类型,用于包装Char数组或SqlString实例。 SqlChar是一个类。 你发现的是正确的,sqlstring限制为nvarchar(4000),sqlchars限制为nvarchar(max)。
(但我们可以通过使用SqlFacet属性定义参数和返回类型的大小、精度和比例。)

请允许我引用alastair先生的话:sqlchar对系统内存资源的要求较低,因为它不需要连续块,正如sqlstring所做的那样。

我很抱歉在当前选择的答案中重复了一些数据,但我想尝试提供一些澄清

首先,简短的回答是:

我对何时使用SqlChars和SqlString的建议与您的意图有关。如果不打算修改输入字符串,请使用SqlString。如果需要操作输入,请使用SqlChars

下面是我如何到达那里的一些细节:

我们可以从文档中看到,SqlChars是一个类,SqlString是一个结构。类vs结构超出了此响应的范围,但可以说结构更轻。您还可以看到SqlChars是可变的(您可以更改它,而不需要新的内存分配)。我找不到涉及SqlString大小限制的文档,并且我在使用大于VARCHAR(8000)/NVARCHAR(4000)的数据和SqlString时没有任何问题。如果存在问题,请确保CLR代码的MaxByteSize=-1

以下信息来自的MSDN文档

班级 SqlChars是一种可变引用类型,用于包装Char数组或SqlString实例

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


你能举出这方面的参考资料吗?我希望SqlString是不可变的,就像大多数字符串一样。虽然SqlChar更像是一个StringBuilder,但数据可以在不重新分配的情况下进行更改,除非保留的大小已超出范围。这与任何更改都需要新分配的不可变字符串不同。感谢您添加此说明。只是为了补充说明:SqlString与SqlChars具有相同的2GB限制。NVARCHAR(1-4000)->SqlString或NVARCHAR(MAX)->SqlChars之间没有固有的映射。这完全取决于如何定义SQL包装器对象。默认映射s(我刚才提到的)和使用sqlfacetmaxsize=-1获取SqlString的NVARCHAR(MAX)的能力纯粹是VisualStudio生成SQL包装器对象的构造。但是您可以手动创建它,也可以更改Visual Studio创建的内容,甚至可以为NVARCHAR(1-4000)执行SQLCHAR。此外,关于“意图”,MSDN页面中还有一条语句用于处理LOB()“这些类型允许将LOB值从数据库流式传输到公共语言运行库(CLR)例程,而不是将整个值复制到托管空间”。所以,假设我有10k的文本,但想做一些像RegEx这样需要字符串的事情,那么还是使用SqlChars来立即执行ToString(因为我在托管空间中有一个它的副本)更好,还是只使用SqlString并删除一个步骤更好?我不知道流式处理的能力,也没有使用过它。流媒体的优势在于,如果您正在将数据从一个位置移动/转换到另一个位置,并且不需要同时使用所有内容。因为你需要所有的数据来做正则表达式,我不认为流式处理会有帮助。如果您要将数据从SQL移动到文件(从MS示例中),在有1GB文件的情况下,这将有助于降低内存压力,因为您不需要一次将所有1GB数据都存储在内存中。我想说,对于正则表达式,SqlString可以,但测试这两种方法并没有什么坏处。这里有一个指向LOB示例的链接,看起来需要做很多工作,但如果您有一些大对象只是被推来推去,这可能有助于降低内存压力。否则,我可能会避开它。在那里的评论让我感到很不舒服,“是从数据库中获取块的最佳方法”<代码>+1用于更正SQLString和最大长度上的错误信息。