🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

1回答

985閲覧

WPFのComboBoxで選択したテーブル名をPostgreSQLのFROM句で扱う方法が知りたいです。

bigpowermind

総合スコア6

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

1クリップ

投稿2021/01/27 02:39

前提・実現したいこと

前提:
WPFを使ってデータベース(PostgreSQL)の中からテーブルをComboBoxで1つ選択。
選択したテーブルのデータをDataGridに表示するようなアプリケーションを作成しています。

実現したいこと:
ComboBoxで選択したテーブルのデータをDataGridで表示できるようになること。

発生している問題・エラーメッセージ

ComboBoxで指定したテーブル名をSelectedValueとして扱えてはいます。
しかし、SELECT文のFROM句の中に変数として扱うことができません。

該当のソースコード

C#

1public partial class ShowWindow : Window 2 { 3 // privateフィールドにObservableCollectionでTableColumnのリストを宣言 4 private ObservableCollection<TableColumn> _tablecolumns = new ObservableCollection<TableColumn>(); 5 6 // 完全コンストラクタパターン 7 private readonly string _comboBoxValue; 8 public ShowWindow(string comboBoxValue) 9 { 10 InitializeComponent(); 11 12 _comboBoxValue = comboBoxValue; 13 14 } 15 16 private void Window_Loaded(object sender, RoutedEventArgs e) 17 { 18 var connString = @"Server=localhost; 19 Port=5432; 20 User Id=postgres; 21 Password=password; 22 Database=DB名"; 23 24 25 using (var conn = new NpgsqlConnection(connString)) 26 { 27 conn.Open(); 28 29 // 下記のFROM句を本来なら_comboBoxValueにしたいができない。 30 var command = new NpgsqlCommand(@"SELECT * FROM _comboBoxValue", conn); 31 32 var dataReader = command.ExecuteReader(); 33 34 while (dataReader.Read()) 35 { 36 _tablecolumns.Add(new TableColumn 37 { 38 Id = dataReader["id"].ToString(), 39 Created_at = (DateTime)dataReader["created_at"], 40 Updated_at = (DateTime)dataReader["updated_at"] 41 42 }); 43 ProductDataGrid.ItemsSource = _tablecolumns; 44 } 45 } 46 } 47 48 public class TableColumn 49 { 50 public string Id { get; set; } 51 public DateTime Created_at { get; set; } 52 public DateTime Updated_at { get; set; } 53 54 } 55 } 56} 57

試したこと

下記のWebページには、
テーブル名が不明だと、問い合わせに対する実行計画を立てられないため、
テーブル名をパラメータ化することはできません。
(これは SQL Server に限った話ではなく、ほかの多くのDBにも当てはまります)
この場合は、動的に SQL 文字列を組み立てて実行させる必要があります。
と書かれていました。
https://dobon.net/vb/bbs/log3-51/30184.html

そのため、動的SQLに関して下記の情報を参考に考えてみたものの、実装方法がわかない状況です。
https://www.it-swarm-ja.tech/ja/sql/%E5%A4%89%E6%95%B0%E3%81%A8%E3%81%97%E3%81%A6%E3%81%AE%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E5%90%8D/970048850/

現在も実装方法を模索しております。
ご教授いただけますと幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

UIの要素とSQLを直接結びつけようとする設計が典型的なアンチパターン。
選択肢に合わせて個別に作成しておいたSQLを呼び分ける構造にすれば良いんじゃないですか。

投稿2021/01/27 05:01

gentaro

総合スコア8947

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bigpowermind

2021/01/27 05:11

回答ありがとうございます。アンチパターンであることは理解しています。 まずは動くものを作ろうと思っていましたので。。 ですが、仰るようにSQLを呼び分ける構造にしてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問