Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.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# SQL Server UDF SQLCLR调用将字符转换为问号_C#_Asp.net_Sql Server_Encoding_Sqlclr - Fatal编程技术网

C# SQL Server UDF SQLCLR调用将字符转换为问号

C# SQL Server UDF SQLCLR调用将字符转换为问号,c#,asp.net,sql-server,encoding,sqlclr,C#,Asp.net,Sql Server,Encoding,Sqlclr,我在谷歌上找不到与我的问题相符的东西 在SQL Server中,我有一个标量函数,我们称之为dbo.MySqlStringFunction。 此函数所做的是调用用C编写的实用程序,该实用程序调用ASP.Net视图并以SqlString形式返回HTML SQL Server中的函数定义为: RETURNS [nvarchar](max) WITH EXECUTE AS CALLER AS EXTERNAL NAME [Utils.UserDefinedFunctions].[MySqlString

我在谷歌上找不到与我的问题相符的东西

在SQL Server中,我有一个标量函数,我们称之为dbo.MySqlStringFunction。 此函数所做的是调用用C编写的实用程序,该实用程序调用ASP.Net视图并以SqlString形式返回HTML

SQL Server中的函数定义为:

RETURNS [nvarchar](max) WITH EXECUTE AS CALLER
AS EXTERNAL NAME [Utils.UserDefinedFunctions].[MySqlStringFunction]
C代码简化为:

var request = (HttpWebRequest)WebRequest.Create("www.mydomain.com");

using (var response = (HttpWebResponse)request.GetResponse())
using (var stream = response.GetResponseStream())
{
   using (var streamReader = new StreamReader(stream, Encoding.UTF8)
   {
      return new SqlString(streamReader.ReadToEnd());
   }
}
当我将C代码放入控制台应用程序并运行它时,我得到的一切都是它应该得到的

当我在浏览器中直接访问URL时,它会显示出应有的效果

但是,当我选择MySqlStringFunction时,字符™, §显示为每个2或3个问号


它似乎位于返回的新SqlString之间。。sql函数返回的值表示有些东西不稳定。但我不知道它可能是什么。

似乎问题在于返回的位置。问题中显示的当前代码使用3个块返回,其中一个是正在读取的UTF-8流。这可能会造成混淆,因为SQLCLR是与SQL Server主内存隔离的内存,通常不能通过流返回。最好先关闭打开的流,让使用块调用Dispose。因此:

使用string _tempreurn=string.Empty在第一个字符串上方创建一个字符串; 在最内部的使用中,将return替换为:_tempreurn=streamReader.ReadToEnd; 在最后一个使用结束括号的下方添加:returnnewsqlstring_TempReturn; 旧答案,将在不久的将来删除

问题在于网页和SQL Server之间的编码差异。您对网页使用的是Encoding.UTF8,这很可能是正确的,因为UTF-8是网站间最常见的编码,但是SQL Server以及.NET和Windows通常都是UTF-16 Little-Endian。这就是为什么代码点127以上的每个字符都会得到2或3?s的原因:UTF-8是一种多字节编码,每个字符使用1、2或3个字节,而UTF-16总是2个字节,补充字符是4个字节,但这是由于它是一对双字节值

您需要在返回流之前或之后将编码转换为UTF-16 Little Endian。而且,UTF-16 Little-Endian是.NET中的Unicode编码,而Big-Endian Unicode是指UTF-16 Big-Endian。因此,您希望转换为Unicode编码


或者,它可能是相反的:网页不是UTF-8,在这种情况下,您在StreamReader中错误地声明了它。如果这是真的,那么您需要在StreamReader构造函数中指定正确的编码。

我在视图中使用了@Response.Charset调用来验证它实际上是utf-8。当我在调用StreamReader后放置断点时,它会正确显示字符。并且文本正确地存储在数据库的其他位置。另外,转换为unicode编码是什么意思?也在应用程序中,或者只是在这个特定的CLR程序集中?没关系,我理解你现在所说的。对于StreamReader,我有Encoding.Unicode和Encoding.bigendianianunicode选项,我应该使用Encoding.Unicode,因为这是小尾端的.Net术语Unicode@Bardicer如果您的服务器具有与SQL server不同的默认语言设置,为什么不尝试消除可能存在的问题SqlString呢。就在返回的上方,您可以输入一个抛出新的异常StreamReader.ReadToEnd;然后查看错误消息中显示了哪些字符?另一个测试是返回SqlChars,在这种情况下,您将返回新的SqlCharsstreamReader.ReadToEnd.tocharray;SqlString和SqlChars具有相同的值。直到实际的返回调用将值发送到SQL server函数,SQL server函数返回一个包含损坏字符的值之前,一切看起来都很好。@Bardicer是否尝试引发异常?您在新SqlChars测试的签名中将返回类型更改为SqlChars,对吗?