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

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

ただいまの
回答率

89.99%

C# SQLで条件の絞り込み検索を行い、データグリットビューに反映させたいです。

受付中

回答 1

投稿

  • 評価
  • クリップ 2
  • VIEW 5,233

ANIC

score 6

前提・実現したいこと

初心者です。
C#、Formアプリケーションにて
書籍管理システムを作っています。
イメージ説明

イメージ説明
現在SQLServerから書籍データを取得してdataGridに一覧表示しているのですが、
画像にある「カテゴリ」、「著者」、「書籍名」、「並び順」の条件を絞込みしての検索ができません。

条件絞込み検索を実装したいです。
※「書籍名」はひらがな検索で実装したいです。

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

現在エラーは発生していないのですが、下記サイトを参考にページング処理を実装しています。

https://support.microsoft.com/ja-jp/kb/307710

上記のサイトの方法でページング処理を実装しますとLoad時にdataGridにSQLの内容をセットしているようなのですが、検索ボタンを押下した際にSQLの内容を取得しdataGridへ表示する方法が分からずにいます。

該当のソースコード

現在実装しているソースコード全文になります。

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


namespace 書籍管理システム
{
    public partial class Form1 : Form
    {
        SqlDataAdapter da;
        DataSet ds;
        DataTable dtSource;
        int PageCount;
        int maxRec;
        int pageSize;
        int currentPage;
        int recNo;

        private void LoadPage()
        {
            int i;
            int startRec;
            int endRec;
            DataTable dtTemp;

            // Clone the source table to create a temporary table.
            dtTemp = dtSource.Clone();
            if (currentPage == PageCount)
            {
                endRec = maxRec;
            }
            else
            {
                endRec = pageSize * currentPage;
            }
            startRec = recNo;

            // Copy rows from the source table to fill the temporary table.
            for (i = startRec; i < endRec; i++)
            {
                dtTemp.ImportRow(dtSource.Rows[i]);
                recNo += 1;
            }
            dataGrid1.DataSource = dtTemp;
            DisplayPageInfo();
        }
        private void DisplayPageInfo()
        {
            txtDisplayPageNo.Text = currentPage.ToString() + "/ " + PageCount.ToString();
        }
        private bool CheckFillButton()
        {
            // Check if the user clicks the "Fill Grid" button.
            if (pageSize == 0)
            {
                MessageBox.Show("Set the Page Size, and then click the Fill Grid button!");
                return false;
            }
            else
            {
                return true;
            }
        }

        public Form1()
        {
            InitializeComponent();

            // コンボボックスの初期値を設定
            comboBox2.SelectedIndex = 0;

            // SQLのインスタンス化
            SqlConnection conn = new SqlConnection();
            SqlCommand command = new SqlCommand();

            // 接続文字列の指定
            conn.ConnectionString = @"Data Source=versapro\sqlexpress;Initial Catalog=書籍管理システム;Integrated Security=True";

            // 接続
            conn.Open();

            // SQL SELECT文の設定
            command.CommandText = "SELECT CATEGORY_NAME FROM MST_CATEGORY";
            command.Connection = conn;

            SqlDataReader reader = command.ExecuteReader();

            // カテゴリコンボボックスに1行ずつ読み取り
            while (reader.Read())
            {
                string name = (string)reader.GetValue(0);
                comboBox1.Items.Add(name);
            }

            // 接続を閉じる
            conn.Close();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // データグリットのカラムをセンター表示
            dataGrid1.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;

            // データグリットの列幅をコントロールの表示領域の幅に合わせて表示
            dataGrid1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;

            // Open Connection. 
            SqlConnection conn = new SqlConnection(@"Data Source=versapro\sqlexpress;Initial Catalog=書籍管理システム;Integrated Security=True;");

            // Set the DataAdapter's query.
            da = new SqlDataAdapter("SELECT MST_CATEGORY.CATEGORY_NAME as カテゴリ,MST_BOOK.BOOK_AUTHOR as 著者,BOOK_NAME as 書籍名,BOOK_NAME_KANA as 書籍名かな FROM MST_BOOK JOIN MST_CATEGORY ON MST_CATEGORY.CATEGORY_CD=MST_BOOK.CATEGORY_CD", conn);

            ds = new DataSet();
            // Fill the DataSet.
            da.Fill(ds, "MST_BOOK");
            // Set the source table.
            dtSource = ds.Tables["MST_BOOK"];

        }

        private void btnFillGrid_Click_1(object sender, EventArgs e)
        {
            // Set the start and max records. 
            pageSize = Convert.ToInt32(txtPageSize.Text);
            maxRec = dtSource.Rows.Count;
            PageCount = maxRec / pageSize;
            // Adjust the page number if the last page contains a partial page.
            if ((maxRec % pageSize) > 0)
            {
                PageCount += 1;
            }
            // Initial seeings
            currentPage = 1;
            recNo = 0;
            // Display the content of the current page.
            LoadPage();

            int cnt = dataGrid1.Rows.Count;
            gaito.Text = "該当件数" + " " + cnt.ToString() + "件";

            // Last,Nextボタンを有効にする
            btnLastPage.Enabled = true;
            btnNextPage.Enabled = true;

            // First,Previousボタンを無効にする
            btnFirstPage.Enabled = false;
            btnPreviousPage.Enabled = false;
        }

試したこと

知り合いはASP.NETで下記コードを実装して
完全一致の絞込みはできたとのことでした。

試してみましたがLoadイベントに書き込むと
「スカラ変数 "@CATEGORY_NAME" を宣言してください。」
とエラーが発生します。

どのように活用していいかのかも分からずにいます。

String categoryname = DropDownList1.SelectedValue;
String bookauthor = TextBox1.Text;
String bookname = TextBox2.Text;
String orderobj = DropDownList2.SelectedValue;

// 接続文字列の取得
var connectionString = ConfigurationManager.ConnectionStrings["BookManagementConnectionString1"].ConnectionString;

using (SqlConnection conn = new SqlConnection(connectionString))
using (var command = conn.CreateCommand())
{
// データベースの接続開始
conn.Open();

// SQLの準備
command.CommandText = "SELECT CATEGORY_NAME, BOOK_AUTHOR, BOOK_NAME, BOOK_NAME_KANA FROM BOOK_SEARCH WHERE CATEGORY_NAME = @CATEGORY_NAME AND BOOK_AUTHOR = @BOOK_AUTHOR AND BOOK_NAME = @BOOK_NAME";

command.CommandText += " order by BOOK_NAME asc";

command.Parameters.Add(new SqlParameter("CATEGORY_NAME", categoryname));
command.Parameters.Add(new SqlParameter("BOOK_AUTHOR", bookauthor));
command.Parameters.Add(new SqlParameter("BOOK_NAME", bookname));

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

Microsoft Visual C# 2008
Microsoft SQLserver 2008

拙い説明で申し訳ございません。
お忙しい中お手数をおかけしますが何卒よろしくお願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

0

下記のように「@」を付けて見てはどうでしょうか?

command.Parameters.Add(new SqlParameter("@CATEGORY_NAME", categoryname)); 
command.Parameters.Add(new SqlParameter("@BOOK_AUTHOR", bookauthor)); 
command.Parameters.Add(new SqlParameter("@BOOK_NAME", bookname));

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/08/19 22:52

    解答ありがとうございます。
    いただいた解答をもとに試してみました結果、Loadイベントのところに書くとda.Fill(ds, "MST_BOOK");の記述のところでスカラ変数 "@CATEGORY_NAME" を宣言してください。というエラーがでます。
    検索ボタンクリックイベントのところに記述するとページング処理を殺してしまうことになります。
    (かと言ってどのようにデータグリットに表示して良いのかも分かりません。)
    質問欄の「該当のソースコード」で記載しているコードにそのまま追加する形かあるいは、
    ページング処理を生かしたままで実装する方法はありませんでしょうか。

    キャンセル

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

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

同じタグがついた質問を見る