SQL Serverと.NET FrameworkのDataSetの照合順序の違いで嵌る

どうも凡人です。
業務で嵌った。
SQL Serverを利用した.NET FrameworkのC/S型システムです。

データベースには、次の値が入ったレコードがありました。

値はString(正しくはvarChar)型です。

レコードA:1,000
レコードB:1,000

カンマが全角と半角の両方利用されている状態です。
それ以外は、この2つは同じ値でした。
どちらも、「カンマで区切られた1000」を表していました。
SQL Server上では、これらの値は区別されていました。

次に、DataSetにこれらのレコードを読み込みます。
すると、レコードAとレコードBの値が同じものとして扱われていました。

int型としてレコードを読み込んだなら、暗黙の型変換が行われるかもしれません。
行われないかもしれませんが。未確認です。
しかし、DataSetのテーブルでは、これらの値はString型として定義していました。

どうやら、.Net FrameworkのDataSetの照合順序はデフォルトではこのあたりを同一として見るようです。

  • 全角と半角を区別しない
  • カタカナとひらがなを区別しない
  • 大文字小文字を区別しない

解決策としては、DataTableのCaseSensitiveプロパティをTrueにする。
そうすると、このあたりを区別します。
ただし、これでもSQL Serverの照合順序とは完全一致しないようです。
このあたりの照合順序の話は、後日しっかりまとめようと思います。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax