私は、GoogleまたはSOに何も見つからなかったため、問題が整理されています。SQL Server UDF SQLCLRコールで文字が疑問符に変換される
SQL Serverでは、私はスカラー関数(dbo.MySqlStringFunction
と呼ぶ)を持っています。 この関数の機能は、C#で記述されたユーティリティを呼び出してASP.Netビューを呼び出し、そのHTMLをSqlStringとして返します。
SQL Server内の関数定義がされています。単純化C#のコードがある
RETURNS [nvarchar](max) WITH EXECUTE AS CALLER
AS EXTERNAL NAME [Utils.UserDefinedFunctions].[MySqlStringFunction]
:
var request = (HttpWebRequest)WebRequest.Create("www.mydomain.com");
using (var response = (HttpWebResponse)request.GetResponse())
using (var stream = response.GetResponseStream())
{
using (var streamReader = new StreamReader(stream, Encoding.UTF8)
{
return new SqlString(streamReader.ReadToEnd());
}
}
私はコンソールアプリにC#のコードを入れて、それを実行すると、私は正確にすべてを取得それがあるべきであるように。
ブラウザで直接URLにアクセスすると、ブラウザのURLに正確に表示されます。
ただし、SELECT MySqlStringFunction()
を実行すると、™、§、¤などの文字はそれぞれ2〜3個の疑問符で表示されます。
return new SqlString(..)
とSQL関数の間に、何かがうまくいくという値を返すように見えます。しかし、私はそれが何であるかについて迷っています。
ビューで '@ Response.Charset'呼び出しを使用して、実際にutf-8であることを確認しました。 StreamReaderを呼び出した後にブレークポイントを置くと、文字が正しく表示されます。また、テキストはデータベース内の別の場所に正しく格納されます。また、Unicodeエンコーディングに変換することによって、どういう意味ですか?アプリケーションでも、このCLRアセンブリでのみ使用できますか? – Bardicer
あなたが今何を言っているのか分かりません。私はStreamReaderの 'Encoding.Unicode'と' Encoding.BigEndianUnicode'オプションを持っていますが、 "Encoding.Unicode"を使うべきです。 "Little Endian Unicode"の.Net用語です。 – Bardicer
@Bardicerなぜ私たちは ' SqlString'が問題になるのを防ぎます(サーバーの設定がSQL Serverと異なる場合)。 'return'のすぐ上に、' throw new Exception(streamReader.ReadToEnd()); 'を入れて、エラーメッセージに表示される文字を確認できますか?別のテストでは 'SqlChars'を代わりに返すことになります。その場合、新しいSqlChars(streamReader.ReadToEnd()。ToCharArray()); ' –