質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

90.00%

DBから取得した値を引数で渡す方法

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 2,958
退会済みユーザー

退会済みユーザー

前提・実現したいこと

今単語帳アプリを作成しています。
DBクラスでDBへの接続、値の取得をして、別のクラスに引数として値を渡し、最終的にはテキストボックスに表示させたいと考えています。
DBUtilsというDB接続用クラスを作成し、スタートボタンクリックイベントで値(単語)を取得し、RichTextBoxに単語を表示。「解答を見る」ボタンがクリックされたら単語に紐づく意味をもう一つのRichTextBoxに表示させようとしています。
PostgreSQL使用はマストです。
おそらくですが接続はできていると思います。あとは値をどう取得してTextBoxに表示すべきかが問題です。
どのようにすべきかアドバイスをください。

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

エラーメッセージ

該当のソースコード

C#

using Npgsql;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WordCards
{
    class DBUtils
    {
        public string DBConnection(string vocab)
        {
            string conStr = "Server = localhost; Port = 5432; User Id = postgres; Password = password; Database = vocab";
            NpgsqlConnection conn = new NpgsqlConnection(conStr);

            try
            {
                conn.Open(); //接続オープン
                var cmd = new NpgsqlCommand(@"select * from vocabschem.t_vocab", conn); //SQL生成し、DBへ
                var dataReader = cmd.ExecuteReader();//結果を取得
                var datas = dataReader;//取得したデータをそしてデータを別のクラスに渡したい。
                vocab = datas.ToString();
                return vocab;

            }
            catch (Exception e)
            {

            }
            conn.Close();
        }
    }
}

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WordCards
{
    public partial class VocabForm : Form
    {
        public VocabForm()
        {
            InitializeComponent();
        }
        private int sec = 10;
        string word;

        private void StartBtn_Click(object sender, EventArgs e)
        {
            if (!RandomRadioBtn.Checked && !OrderRadioBtn.Checked)
            {
                MessageBox.Show("表示形式を選択してください。");
            }
            /*else if(CategoryComboBox.Text == "カテゴリ選択")
            {
                MessageBox.Show("カテゴリ選択をしてください");
            }*/
            else
            {
                //スタートボタンクリック時に非表示・表示を設定
                StartBtn.Visible = false;
                RandomRadioBtn.Visible = false;
                OrderRadioBtn.Visible = false;
                TimerRadioBtn.Visible = false;
                CategoryComboBox.Visible = false;
                CategGroupBox.Visible = false;
                WordLabel.Visible = true;
                MeaningLabel.Visible = true;
                WordsRichTxtBox.Visible = true;
                MeanRichTxtBox.Visible = true;
                BackBtn.Visible = true;
                ShowAnsBtn.Visible = true;
                NextBtn.Visible = true;
                CountDownTimerLabel.Visible = true;

                if (TimerRadioBtn.Checked)
                {
                    CDTimer.Start();
                }

               public string DBConnection(vocabulary)


            }

        }

        private void ExitBtn_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void AddWordsMenuItem_Click(object sender, EventArgs e)
        {
            AddWordsForm AddWordsForm = new AddWordsForm();
            AddWordsForm.Show();

        }

        private void CDTimer_Tick(object sender, EventArgs e)
        {
            if(sec > 0)
            {
                sec = sec - 1;
                CountDownTimerLabel.Text = "残り" + sec + "秒";
            }
        }
    }
}

試したこと

いろいろと調べましたが、なかなか進みません

補足情報(言語/FW/ツール等のバージョンなど)

使用言語 C#
使用ツール Visual Studio2015(Windows FormApplication) and PostgreSQL 9.3
DB接続はNpgsqlです
OSはWindows 10です
ConsoleApplicationで一度DB接続を練習したときは(おそらくですが)動きました。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • SurferOnWww

    2016/10/16 16:42

    コードは ``` と ``` で囲ってください。インデントされて見やすくなるので。あと、何を作っているか(Windows Forms? WPF? ASP.NET Web Forms? その他?)と自分の環境(OS, .NET のバージョンなど)を書いてはいかがですか?

    キャンセル

回答 1

0

何を作っているかという質問に答えてもらっていませんが、VocabForm : Form というコードから Windows Forms アプリであろうと想像してレスします。

PostgreSQL が Visual Studio のデータソース構成ウィザードを使えるようなプラグインを提供しているかどうか分かりませんが(ちなみに、MySQL や Oracle は提供してます)、提供しているのであればそれを使って型付 DataSet / DataTable + TableAdapter を使って以下の記事の図にあるような構成のアプリを作るのが定番です。

Visual Studio でのデータへの接続の概要
https://msdn.microsoft.com/ja-jp/library/wxt2cwcc(VS.80).aspx

具体的な手順は、DB が SQL Server の場合ですが、以下の記事が参考になると思います。

10 行でズバリ !! 非接続型のデータ アクセス (ADO.NET) (C#)
https://code.msdn.microsoft.com/windowsdesktop/10-ADONET-C-cbfe7688

上のチュートリアルは、2 つのテーブルを、TableAdapterManager を利用して階層更新をかけるというちょっと複雑なことをしていますが、テーブルが一つなら非常に簡単になります。

慣れれば、自分では 1 行もコードを書かなくても、10 分もかからず、一覧の表示、レコードの編集ができるアプリを作れます。

この中に質問者さんの質問:

DBから取得した値を引数で渡す方法

に対する回答も含まれています。検討してみてください。

#PostgreSQL の使用は MUST なのでしょうか? そうではなくて、C# でのDB 関係のプログラムの書き方を勉強するのが目的なら SQL Server を使ってはいかがですか?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/17 07:15

    ありがとうございます。PostgreSQLの使用はマストです。おそらくDBの接続はうまくいっているのかなと思います。値をどう取得し、表示していこうか悩んでおります

    キャンセル

  • 2016/10/17 11:06

    「おそらくDBの接続はうまくいっているのかなと思います」ということで、そこのところの自信がなさそうですが、どうやって確認しているんでしょう?

    アップされたコードには間違いがあって(はっきり言わせていただけるとメチャクチャ)、それでは接続ができたとしても、必要なデータは取得できないです。

    ですが、そこを直したとしても、アプリから DB への接続がうまく行ってないのでは何ともならないです。

    簡単なコンソールアプリを作って確認してみませんか? ググって探せばサンプルは多々見つかると思います。

    それが確認できてから、そのコードをベースに話を進めるのがいいと思います。今回の目的のために DB から取得するためのコードにしていただけると話が早そうですので、できるだけそのようにしてください。


    #今回の話とは直接関係のないことですが、今後のため以下の原則を守ることをオススメします。

    (1) 接続は必ずクローズされるようにする。(質問者さんがアップされたコードでは例外が出るとクローズされないので NG です)

    (2) Exception はキャッチしない。

    上記 (1), (2) の理由は下記の記事を参照してください:

    https://blogs.msdn.microsoft.com/nakama/2008/12/29/net-part-1/

    https://blogs.msdn.microsoft.com/nakama/2009/01/02/net-part-2/

    https://msdn.microsoft.com/ja-jp/magazine/dd419661.aspx

    キャンセル

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

  • ただいまの回答率 90.00%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる