2016-05-01 90 views
1

我在使用unicode(希伯來文和俄文)與SQL CLR集成時遇到問題。作爲測試,我在Visual Studio中做了一個簡單的數據庫項目具有以下CLR存儲過程:如何使SQLCLR中的SqlContext.Pipe.Send存儲過程與unicode一起工作?

[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服務器的存儲過程:

EXEC dbo.TestProc; 

無論是跟蹤輸出和SQL服務器消息用'????'替換非英文字符。

我以爲SQL服務器和C#都使用unicode。在Windows窗體項目中使用unicode,例如通過將非英文文本添加到文本框中,可以正常工作。

我該如何解決這個問題?有我缺少的設置嗎?

這個問題涉及到以下幾點:How to pass nvarchar (non-English) to CLR (C#) stored procedure?

+0

我用你的代碼測試,還得到了「????「對於希伯來語和俄語,即使我將數據庫的默認校對更改爲」Hebrew_100_CI_AS「(這不應該是必需的,但只是爲了測試),我將在明天看到更多的內容。 –

+0

哦,萬一它是相關的,我也嘗試發送字符串,只包含希伯來字符/除俄羅斯以外的其他字符,並獲得所有????,所以問題不在於混合不同的代碼頁(我不知道這是不是一件事) – MASQ

回答

3

我猜測,而做這個測試,你永遠不關閉並重新打開包含的.cs文件的標籤。那是對的嗎?您會發現,Visual Studio不會編輯編輯器中的代碼,它會編譯保存在您可能正在編輯的文件中的代碼。這些通常是100%相同的,但是當涉及基於127以上值的「字符」時,則代碼頁/編碼變得重要。並且要清楚,我們正在討論數據庫的C#文件的編碼/代碼頁,而不是

的問題是,默認編碼,至少在我的系統,我懷疑在美國境內最,是「視窗1252」。所以發生的是,當你將這些代碼編譯進程序集時,編輯器中的內容會被保存到磁盤中。但是,文件編碼不能支持這些字符,因此它們會變成?在C#文件!是的,編譯的代碼是而不是你在屏幕上看到的是什麼。但是如果您要關閉.cs文件並重新打開它,則會看到它。希伯來文和俄文文本都將是? s。這就是SQL Server被要求打印的內容。

爲了解決這個問題,只是去文件菜單,選擇高級保存選項...並在編碼頂部下拉菜單中,選擇:

  • 的Unicode( UTF-8與簽名) - 代碼頁65001

    或:

  • 的Unicode - 代碼頁1200這一個應該小號AVE爲UTF-16小字節序]

與預期的希伯來語和俄語字符替換?。現在您可以構建和發佈,並按預期顯示這些字符。

+1

你是對的,只要我關閉並重新打開代碼本身內的所有非英文字符變成了????使用高級保存選項確實修復了SQL正在打印的內容Trace仍在打印????但這可能更多使用DebugViewer設置,重要的是我知道C#可以將正確的字符發送到SQL並且可以調試非英文字符串。 – MASQ

相關問題