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#コードには英語以外の文字は含まれていませんが、英語以外の文字列を使用した文字列の書式設定を使用していたため、何らかの組み合わせのエンコーディングが発生しました。文字列形式が保存されました。しかし、私の推測。 誰かが(私のあいまいな定義にもかかわらず)関連する問題に遭遇した場合、そのことを試してみるとよいでしょう。
XMLをRDBMSからアプリケーションにどのように転送しますか? – Shnugo
@ Shnugo C#コードをストアドプロシージャとして追加し、SQLからストアドプロシージャを呼び出しました。限り、私はVSがアセンブリにC#のコードを回し、そのアセンブリをEXTERNALと呼ぶストアドプロシージャを自動的に作成することができます。 – MASQ
はい、デフォルトでは、Windows/.NET/SQL Server( 'NVARCHAR' /' NCHAR'/'XML')の文字列はUTF-16リトルエンディアンです。 'SqlXml'や' SqlString'/'SqlChars'のいずれの場合でも、SQL ServerからSQLCLRオブジェクトにXMLから転送する際には、文字の変更は必要ありません。あなたは 'char []'を与える 'SqlChars'を試しましたか?新しい文字列を作成することができます: 'string _Test = new string(SqlCharsParam.Value);'。 –