2016-04-28 14 views
1

Visual Studioで作業していますが、FOR XML RAWとC#コードのSqlXml型のパラメータ(XmlReaderを使用して行を処理する意図を持つ)を使用して、行全体をCLRストアドプロシージャに渡そうとしています。行には、nvarcharフィールドが含まれています。CLR(C#)ストアドプロシージャにnvarchar(英語以外)を渡す方法はありますか。

nvarcharフィールドに英語/数字/単純な句読点テキストが含まれている場合はすべて正常に動作しますが、ヘブライ語またはロシア語の文字が含まれている場合、これらの文字は疑問符に変わります。 (RTLの問題ではなく、ロシア語のみのテキストでも同じです)

SQLコードの印刷物から、XML RAWで作成されたxmlは英語以外の文字を保持していることがわかりました。しかし、sqlXmlParameter.Valueを出力する(または出力文字列に入れてsqlで印刷する)ときに、英語以外の文字の代わりに疑問符が表示されます。 私はSqlStringパラメータを使用しようとしましたが、同じ結果を得ました - パラメータはSQLではうまく見えますが、CLRプロシージャに渡されると変更されます。

また、T-SQLとC#の両方でUTF-16がデフォルトのエンコーディングとして使用されていることがわかりました。これは本当に変です。

パラメータをCLRに渡すとき、またはエンコーディング情報を添付するときに、英語以外の文字を保持するにはどうすればよいですか?

編集:この質問は次のようなものです。How to make SqlContext.Pipe.Send in SQLCLR stored proc work with unicode? 他の質問の解決策もこの問題を解決しました。この場合のC#コードには英語以外の文字は含まれていませんが、英語以外の文字列を使用した文字列の書式設定を使用していたため、何らかの組み合わせのエンコーディングが発生しました。文字列形式が保存されました。しかし、私の推測。 誰かが(私のあいまいな定義にもかかわらず)関連する問題に遭遇した場合、そのことを試してみるとよいでしょう。

+0

XMLをRDBMSからアプリケーションにどのように転送しますか? – Shnugo

+0

@ Shnugo C#コードをストアドプロシージャとして追加し、SQLからストアドプロシージャを呼び出しました。限り、私はVSがアセンブリにC#のコードを回し、そのアセンブリをEXTERNALと呼ぶストアドプロシージャを自動的に作成することができます。 – MASQ

+0

はい、デフォルトでは、Windows/.NET/SQL Server( 'NVARCHAR' /' NCHAR'/'XML')の文字列はUTF-16リトルエンディアンです。 'SqlXml'や' SqlString'/'SqlChars'のいずれの場合でも、SQL ServerからSQLCLRオブジェクトにXMLから転送する際には、文字の変更は必要ありません。あなたは 'char []'を与える 'SqlChars'を試しましたか?新しい文字列を作成することができます: 'string _Test = new string(SqlCharsParam.Value);'。 –

答えて

0

ストアドプロシージャを呼び出す方法が間違っている可能性があります(つまり、ストアドプロシージャを呼び出すためのC#またはT-SQL)が提供されていません。ほとんどの場合、UnicodeおよびXMLリテラルの先頭には、Unicodeとして保持するためにNが付いていません。 SqlStringSqlChars、およびSqlXml(サンプルヘブライ語とあなたの関連質問から取られたロシア語のテキスト):次のC#コードとT-SQLには、SQLCLRが適切にすべての3つのデータ型間でUnicode文字を受け入れ、表示しないことを示して

C#

using System; 
using System.Data.SqlTypes; 
using Microsoft.SqlServer.Server; 

public class UnicodeTesting 
{ 
    [Microsoft.SqlServer.Server.SqlProcedure] 
    public static void PrintTest(SqlString StringParam, SqlChars CharsParam, 
           SqlXml XmlParam) 
    { 
     SqlContext.Pipe.Send("Unicode test: blip"); 
     SqlContext.Pipe.Send("Unicode test: בליפ"); 
     SqlContext.Pipe.Send("Unicode test: Блип"); 

     SqlContext.Pipe.Send("StringParam: " + StringParam.Value); 
     SqlContext.Pipe.Send("CharsParam: " + new String(CharsParam.Value)); 
     SqlContext.Pipe.Send("XmlParam: " + XmlParam.Value); 
    } 
} 

T-SQL

EXEC dbo.PrintTest N'בליפ a', 
        N'בליפ b', 
        N'<test>בליפ c</test><test>Блип</test>'; 

出力(「メッセージ」タブ内)

Unicode test: blip 
Unicode test: בליפ 
Unicode test: Блип 
StringParam: בליפ a 
CharsParam: בליפ b 
XmlParam: <test>בליפ c</test><test>Блип</test> 
+0

私はストアドプロシージャのパラメータとしてFOR XMLの結果を渡します。パラメータはXML型ですから、直接Nを追加することはできません。結果のxmlをデバッグ用に出力すると、英語以外の言語でも問題はないようです。サーバーはatmですが、代わりにnvarcharとして送信してみてください(変換オーバーヘッドが追加されます)。 – MASQ

+0

@マスコットあなたはまだ私が本当に助けるにはあまりにも曖昧です。パラメータがXMLであることはわかっていますが、FOR XMLの結果を最初に変数に格納していることは明らかです。 SQLを生成し、SQLCLRストアドプロシージャを呼び出すために使用しているT-SQLで質問を更新する必要があります。 –

+0

私は自分の仕事でちょっと新しく、他の人のコード(あるいは何か)に関するポリシーが何であるか分からない。私は編集されたコードサンプルを投稿するつもりでしたが、C#コードの保存設定を(私の他の質問のあなたの答えから)何とか解決したように見えます。 – MASQ