【问题标题】:How to make SqlContext.Pipe.Send in SQLCLR stored proc work with unicode?如何使 SQLCLR 存储过程中的 SqlContext.Pipe.Send 与 unicode 一起使用?
【发布时间】:2016-08-26 05:55:26
【问题描述】:

我在将 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 服务器消息都将非英文字符替换为 '????'。

我认为 SQL Server 和 C# 都可以使用 unicode。在 Windows 窗体项目中使用 unicode,例如通过将非英文文本添加到文本框,可以正常工作。

我该如何解决这个问题?有没有我遗漏的设置?

此问题涉及以下内容:How to pass nvarchar (non-English) to CLR (C#) stored procedure?

【问题讨论】:

  • 我用你的代码测试过,也得到了“????”对于希伯来语和俄语,即使我将数据库的默认排序规则更改为Hebrew_100_CI_AS(这不是必需的,只是为了测试)。明天我会再看看这个。
  • 哦,如果它是相关的,我还尝试发送只包含希伯来字符/只包含俄语的字符串并且得到了所有 ????,所以问题不在于混合不同的代码页(我不'不知道这是不是一件事)。

标签: .net sql-server unicode character-encoding sqlclr


【解决方案1】:

我猜在进行此测试时,您从未关闭并重新打开包含 .cs 文件的选项卡。那是对的吗?您会看到,Visual Studio 不会在编辑器中编译代码,它会编译保存在您当前可能正在编辑的文件中的代码。这些通常 100% 相同,但是当涉及基于高于 127 的值的“字符”时,代码页/编码变得很重要。为了清楚起见,我们谈论的是 C# 文件的编码/代码页,不是数据库的。

问题是默认编码,至少在我的系统上,我怀疑在美国的大多数系统上,是“Windows 1252”。所以发生的事情是,当您将此代码编译到程序集中时,编辑器中的内容会保存到磁盘中。但是文件编码不支持这些字符,因此它们在 C# 文件中变成了? !是的,编译的代码不是你在屏幕上看到的。但是,如果您要关闭 .cs 文件并重新打开它,您会看到它。希伯来文和俄文文本都是?s。这就是 SQL Server 被要求打印的内容。

要解决此问题,只需转到 文件 菜单,选择 高级保存选项... 并在顶部下拉菜单中选择 编码,选择任一:

  • Unicode(带签名的 UTF-8) - 代码页 65001

    或:

  • Unicode - Codepage 1200 [这个应该保存为 UTF-16 Little Endian]

? 替换为预期的希伯来语和俄语字符。现在您可以构建和发布,并按预期显示这些字符。

【讨论】:

  • 你是对的,只要我关闭并重新打开代码本身中的所有非英文字符就变成了????。使用高级保存选项确实修复了 SQL 正在打印的内容。 Trace 仍在打印 ????,但这可能与 DebugViewer 设置有关,重要的是我知道 C# 可以将正确的字符发送到 SQL 并可以调试非英文字符串。
猜你喜欢
  • 2015-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-01
  • 1970-01-01
相关资源
最近更新 更多