我在将SQL CLR与unicode(希伯来语和俄语文本)集成时遇到问题。作为测试,我在Visual Studio中使用以下CLR存储过程创建了一个简单的数据库项目:
[Microsoft.SqlServer.Server.SqlProcedure]
public static void TestProc ()
{
//Console.OutputEncoding = System.Text.Encoding.Unicode;
Trace.WriteLine("Unicode test: blip");
Trace.WriteLine("Unicode test: בליפ");
Trace.WriteLine("Unicode test: Блип");
SqlContext.Pipe.Send("Unicode test: blip");
SqlContext.Pipe.Send("Unicode test: בליפ");
SqlContext.Pipe.Send("Unicode test: Блип");
}
发布到测试数据库并在SQL Server中执行存储过程:
EXEC dbo.TestProc;
跟踪输出和SQL Server消息都将非英语字符替换为'????'。
我以为SQL Server和C#都可以使用unicode。在Windows Forms项目中使用unicode(例如,通过将非英语文本添加到文本框)可以正常工作。
我怎样才能解决这个问题?我缺少某些设置吗?
该问题与以下内容有关:如何将nvarchar(非英语)传递给CLR(C#)存储过程?
我猜想在进行此测试时,您从未关闭并重新打开包含.cs文件的选项卡。那是对的吗?您会看到,Visual Studio不会在编辑器中编译代码,而是会编译保存在您当前正在编辑的文件中的代码。这些通常是100%相同的,但是当涉及到基于127以上的值的“字符”时,那么代码页/编码就变得很重要。明确地说,我们正在谈论的是C#文件而不是数据库的“编码/代码页” 。
问题是,至少在我的系统上,并且我怀疑在美国大部分地区,默认编码是“ Windows 1252”。因此,发生的事情是,当您将此代码编译到Assembly中时,编辑器中的内容将保存到磁盘中。但是文件编码不能支持这些字符,因此它们会?
在C#文件中变成!是的,正在编译的代码不是您在屏幕上看到的。但是,如果您要关闭.cs文件并重新打开它,则会看到它。希伯来语和俄语文本均为?
s。这就是要求SQL Server打印的内容。
要解决此问题,只需转到“文件”菜单,选择“高级保存选项...”,然后在“编码”的顶部下拉菜单中选择以下任一选项:
Unicode(带签名的UTF-8)-代码页65001
或者:
Unicode-代码页1200 [此应另存为UTF-16 Little Endian]
将替换为?
预期的希伯来语和俄语字符。现在,您可以构建和发布并使这些字符按预期显示。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句