2009-04-29 7 views
6

私はSqlCommand.ExecuteXmlReaderを使用してXmlReaderを取得した後、データを解析してXMLドキュメントを作成するXML SQLストアドプロシージャをMS SQL 2005に用意しました。問題は、SQLのデータにUTF-8 XML文書内で不正なバイナリ文字が含まれているため、例外がスローされることです。.NETでの不正なXML文字のフィルタ

他に誰かがこの問題に対処していますか? DBへの入力時にデータをフィルタリングすることを検討しましたが、フィルタリングをどこにでも置かなければならず、すべての文字をチェックする必要があります。

他の提案はありますか?

編集: データは通常、さまざまな長さのvarcharカラムに格納されます。データは、実際にはWebフォーム(ASP .NETアプリ)のユーザーから入力されます。時にはMS Wordなどからコピー貼り付けして、これらの変なバイナリ文字を入れます。

答えて

0

私はアプリケーション内のどこでもSqlParameterオブジェクトの作成を抽象化しました。その時点で入力をスクラブします。私の抽象メソッドは、ストアドプロシージャコールで使用するSqlParameterオブジェクトを作成して返します。呼び出し元が望むvarcharの場合、SqlParameterオブジェクトに入れたい文字列の各文字をループし、これらの不正なバイナリXML文字をフィルタリングします。これにより、悪いデータが最初にデータベースに入ることがなくなります。

0

どのように悪いデータがデータベースに入りましたか? XML列を使用していますか?

データベースにデータを入力するために使用されるストアドプロシージャにフィルタリング(実際には「検証」と呼ばれる)を入れることができます。また、トリガを追加して、どこからデータを取得してもデータをチェックできます。

通常、不正なデータがデータベースに侵入しないようにしてください。

+0

データは、データベースのvarcharカラムにユーザ入力として格納されます。 –

0

これはエンコードの問題ですか?または、XMLが不正な形式ですか?もし不正な形になったら、私は助けることができません。しかし、エンコーディングの場合、ExecuteXmlReaderはエンコーディングを指定できませんが、データをBLOBとして扱い、独自のエンコーディングで個別に処理することができます。XmlReader

データが大きい場合は、おそらくCommandBehavior.SequentialAccessExecuteReaderを使用して、一時ファイル(Path.GetTempFileName())にそれを書きたいと思います - そしてXmlReaderStreamように、そのファイルを処理します。

0

ストアドプロシージャはどのようにXMLを生成しますか?あなたは、SQL ServerでのXMLのオプションのいずれかを使用している場合は、テキストフィールド内のバイナリ文字は適切にエスケープされます。

CREATE TABLE test (
    id int identity(1,1) not null primary key, 
    data nvarchar(50)) 
INSERT INTO test (data) values (char(0)) 
SELECT * FROM test FOR XML RAW 

は生成します。

<row ID="1" data="&#x0;" /> 
+0

"For Xml Explicit"を使用しています –

+0

これは問題ではありません。 FOR XML EXPLICITはバイナリXML文字も正しくエスケープします。 –

1

を私は過去ログのSqlClient「スクランブル」を見てきましたデータベース内のnvarchar列からのデータは、「サロゲートコードポイント」を行うには、そのものだった私たちの理論は、以下を参照してください。

http://www.siao2.com/2005/07/27/444101.aspx

http://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=rzaaxsurrogate.htm

http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/admin/c0004816.htm

これは、パフォーマンスへの影響を持っていたものの、SqlClientでは(これを停止するように見えたのnvarchar(MAX)に変換し、バイトの一部は、当社のXMLはもはや十分に形成されなかったことをmeaing「解釈」するように見えました):

SELECT CONVERT(NVARCHAR(MAX), MyValue) FROM ... 

NVARCHAR(MAX)、NVARCHAR(N)does not workを使用する必要があることに注意してください。

また、OleDBプロバイダーも(SqlClientよりも低速ですが)正しく動作することがわかりました。