直近に手掛けたWPFアプリ開発で遭遇した出来事の備忘録。
クラサバアーキテクチャに対してMVVM的な実装をしているのですが、データベーステーブルの内容を単純に表示するようなシーンでDataTable(あるいはDataView)をコンボボックスなどに直接バインドして使っている箇所があります。
フィルタリングやソートなども特に問題なくできるので、Modelを作る手間が省けて意外と重宝しているのですが、ひとつ注意が必要なことがありました。
当該アプリはOracleとPostgreSQLの両方に対応しているのですが、OracleのDataTableをバインドした場合、XAML内のフィールド名を以下のように「大文字」で記述する必要がありました。
一方で、DB接続をPostgreSQLにした場合は「小文字」で記述しないと認識されないという困った事態に…
<!-- コンボボックスの場合 --> <ComboBox ItemsSource="{Binding XxxTable}" SelectedItem="{Binding XxxSelectedRow}" SelectedValuePath="ID" DisplayMemberPath="NAME" /> <!-- リストビューの場合 --> <ListView ItemsSource="{Binding XxxTable}" SelectedItem="{Binding XxxSelectedRow}"> <ListView.View> <GridView> <GridViewColumn Header="Id"> <GridViewColumn.CellTemplate> <DataTemplate> <Grid> <TextBlock Text="{Binding ID}"/> </Grid> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> <GridViewColumn Header="Name"> <GridViewColumn.CellTemplate> <DataTemplate> <Grid> <TextBlock Text="{Binding NAME}"/> </Grid> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> </GridView> </ListView.View> </ListView>
クエリ自体は共通で、クエリ文字列内のカラム名は全て小文字で記述していたわけですが、試しに大文字に変えてみたところ、PostgreSQLでも大文字でのバインドが通るようになりました。
どうやらPostgreSQLはクエリ上の文字が素直にそのまま適用されるという仕様であるのに対し、Oracleは常に大文字でないとダメということのようです。
結局、XAML側は大文字のまま、クエリ文字列も触らず小文字のまま、クエリ実行結果のDataColumn.ColumnNameをPostgreSQLの場合だけ大文字変換してから返却するように対応して難を逃れた次第。
データプロバイダの問題のような気もしますので一応書いておくと、OracleはODP.NET(Oracle.DataAccess.dll)、PostgreSQLはNpgsql(npgsql.dll)を使用しています。(いずれも.NET 2.0版)