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

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

新規登録して質問してみよう
ただいま回答率
85.48%
DataGrid

GUIの一種であり、データを表の形式でみることが可能です。

C#

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

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Q&A

1回答

17561閲覧

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

ANIC

総合スコア8

DataGrid

GUIの一種であり、データを表の形式でみることが可能です。

C#

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

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

0グッド

3クリップ

投稿2016/08/19 06:00

###前提・実現したいこと

初心者です。
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

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

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

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

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

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

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

guest

回答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 06:46

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

ANIC

2016/08/19 13:52

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問