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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C#

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

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

解決済

2回答

8788閲覧

SQLのパラメータを設定後、ExecuteReaderを実行しても HasRowsがfalseになる

mogumogu

総合スコア12

C#

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

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

0グッド

0クリップ

投稿2016/09/29 09:50

C#初心者です。

SQLのSELECTコマンドを使い、データベースに接続してGridViewにデータを表示させようとしています。
ユーザーがドロップダウンリストの選択やテキストボックスの入力文字列入力して検索ボタンを押すと、GridViewにデータが表示される仕組みです。

しかし、デバッグを行ったところ、HasRowsがfalseになってしまい接続が閉じてしまいます。
また、GridViewもデータバインドは行っておりますが表示されません。
SqlDataReader sdr = com.ExecuteReader();の行では、選択項目は取得出来ているようなのですが、どのように処理すれば良いかわかりません。

SQLパラメータの設定がおかしいのでしょうか?
ご教示のほど、よろしくお願いいたします。

C#

1コーusing System; 2using System.Collections.Generic; 3using System.Data; 4using System.Data.SqlClient; 5using System.Linq; 6using System.Web; 7using System.Web.UI; 8using System.Web.UI.WebControls; 9 10namespace LoginTest 11{ 12 public partial class Psearch : System.Web.UI.Page 13 { 14 //ページロード時の処理 15 public void Page_Load(object sender, EventArgs e) 16 { 17 GridView1.Visible = true; 18 19 } 20 21 //チーム名のドロップダウンリストの値を取得 22 public void Team_SelectedIndexChanged(object sender, EventArgs e) 23 { 24 var team = (DropDownList)sender; 25 this.Team.Text = this.Team.SelectedValue; 26 string tm = this.Team.Text.Trim(); 27 } 28 29 //顧客名のドロップダウンリストの値を取得 30 protected void Customer_SelectedIndexChanged(object sender, EventArgs e) 31 { 32 33 var customer = (DropDownList)sender; 34 this.Customer.Text = this.Customer.SelectedValue; 35 string ct = this.Customer.Text.Trim(); 36 } 37 38 //プロジェクト責任者のドロップダウンリストの値を取得 39 protected void Rpsn_SelectedIndexChanged(object sender, EventArgs e) 40 { 41 42 var rpsn = (DropDownList)sender; 43 this.Rpsn.Text = this.Rpsn.SelectedValue; 44 string rp = this.Rpsn.Text.Trim(); 45 } 46 47 //プロセス状況のドロップダウンリストの値を取得 48 protected void Prcs_SelectedIndexChanged(object sender, EventArgs e) 49 { 50 51 var prcs = (DropDownList)sender; 52 this.Prcs.Text = this.Prcs.SelectedValue; 53 string pr = this.Prcs.Text.Trim(); 54 55 } 56 57 //物件コードを入力時に文字列を取得 58 public void Pcinput_TextChanged(object sender, EventArgs e) 59 { 60 string pcinput = this.Pcinput.Text.Trim(); 61 62 } 63 64 //物件名を入力時に文字列を取得 65 protected void Pninput_TextChanged(object sender, EventArgs e) 66 { 67 string pninput = this.Pninput.Text.Trim(); 68 } 69 70 71 72 //検索ボタンをクリックした時の処理 73 public void Search_Click(object sender, EventArgs e) 74 { 75 //接続文字列を作成する 76 string sConnectionString; 77 sConnectionString = @"Data Source=(localdb)\ProjectsV13;Initial Catalog=ProjectManagement;Integrated Security=True"; 78 79 80 //コネクションオブジェクトを作成する 81 SqlConnection objConn = new SqlConnection(sConnectionString); 82 83 84 85 //SQL文を生成する 86 string sqlall = "SELECT DISTINCT TPROJECT.PCODE AS 物件コード, TPROJECT.NAME AS 物件名, MCUSTOMER.NAME AS 顧客名, TPROJECT.TEAM AS チーム名, TPROJECT.RPSN AS プロジェクト責任者, TPROJECT.PRCSNAME AS プロセス状況 FROM TPROJECT INNER JOIN MCUSTOMER ON TPROJECT.CCODE = MCUSTOMER.CCODE WHERE (TPROJECT.PCODE = '[@PCODE]') OR (TPROJECT.NAME = N'[@NAME]') OR (MCUSTOMER.NAME = N'[@NAME]') OR (TPROJECT.TEAM = N'[@TEAM]') OR (TPROJECT.RPSN = N'[@RPSN]') OR (TPROJECT.PRCSNAME = N'[@PRCSNAME]') "; 87 88 89 //コマンドオブジェクトを生成する 90 SqlCommand com = new SqlCommand(sqlall, objConn); 91 92 93 //接続をオープンする 94 objConn.Open(); 95 96 SqlParameter p1 = com.CreateParameter(); 97 SqlParameter p2 = com.CreateParameter(); 98 SqlParameter p3 = com.CreateParameter(); 99 SqlParameter p4 = com.CreateParameter(); 100 SqlParameter p5 = com.CreateParameter(); 101 SqlParameter p6 = com.CreateParameter(); 102 103 //チーム名のパラメータ1を作成 104 p1.ParameterName = "@TEAM"; 105 p1.SqlDbType = SqlDbType.NVarChar; 106 p1.Direction = ParameterDirection.Input; 107 p1.Value = this.Team.Text.Trim(); 108 com.Parameters.Add(p1); 109 110 111 112 //顧客名のパラメータ2を作成 113 p2.ParameterName = "@CUSTOMER"; 114 p2.SqlDbType = SqlDbType.NVarChar; 115 p2.Direction = ParameterDirection.Input; 116 p2.Value = this.Customer.Text.Trim(); 117 com.Parameters.Add(p2); 118 119 120 121 //プロジェクト責任者のパラメータ3を作成 122 p3.ParameterName = "@RPSN"; 123 p3.SqlDbType = SqlDbType.NVarChar; 124 p3.Direction = ParameterDirection.Input; 125 p3.Value = this.Rpsn.Text.Trim(); 126 com.Parameters.Add(p3); 127 128 129 130 //プロセス状況のパラメータ4を作成 131 p4.ParameterName = "@PRCS"; 132 p4.SqlDbType = SqlDbType.NVarChar; 133 p4.Direction = ParameterDirection.Input; 134 p4.Value = this.Prcs.Text.Trim(); 135 com.Parameters.Add(p4); 136 137 138 //物件名のパラメータ5を作成 139 p5.ParameterName = "@NAME"; 140 p5.SqlDbType = SqlDbType.NVarChar; 141 p5.Direction = ParameterDirection.Input; 142 p5.Value = this.Pninput.Text.Trim(); 143 com.Parameters.Add(p5); 144 145 146 147 //物件コードのパラメータ6を作成 148 p6.ParameterName = "@PCODE"; 149 p6.SqlDbType = SqlDbType.Char; 150 p6.Direction = ParameterDirection.Input; 151 p6.Value = this.Pcinput.Text.Trim(); 152 com.Parameters.Add(p6); 153 154 155 //読み込んだ情報を表示する 156 SqlDataReader sdr = com.ExecuteReader(); 157 158 if (sdr.HasRows) { 159 160 161 while(sdr.Read()) 162 { 163 164 GridView1.DataSource = sdr; 165 GridView1.DataBind(); 166 } 167 168 } 169 170 objConn.Close(); 171 } 172 173 174 } 175 176 177 178 } 179 180

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2016/09/29 14:56 編集

すみませんが正直言ってアップされたコードは長くて読む気がしません。問題を再現できる程度に必要最低限にコードを絞っていただけませんか。
退会済みユーザー

退会済みユーザー

2016/09/29 14:54

訂正
退会済みユーザー

退会済みユーザー

2016/09/29 14:55

訂正
Panzer_vor

2016/09/29 23:11 編集

他の方から既に指摘が出ておりますが、 コードはもう少し要点を絞ると良いと思います。 またExecuteReaderの時点では値が取れるとのことですが、 どのように確認していますでしょうか? 可能でしたら念のため、 パラメタ部分に実際入っている値を設定したSQLをSQLクライアントツール(SQL Server Management Studio)などで直接実行し結果を確認してみてください。
mogumogu

2016/10/01 00:26

SurferOnWwwさん 申し訳ありません、コードはもう少し簡潔に書いて質問いたします。
mogumogu

2016/10/01 00:31

Panzer_vorさん Executereaderの行にブレークポイントを置いて、デバッグして値を確認しています。 サーバでSQLを実行したところ、カラムのヘッダーは表示されていました。where句以降を削ると全件表示されましたので、where句に問題がありそうです。
guest

回答2

0

ベストアンサー

今思い出しましたが、先のスレッド(URL 下記)の話の続きですよね?

https://teratail.com/questions/48827

であれば、質問の一番最初にそのことを書いておいていただくようお願いします。

先のスレッドでは私が以下の記事を紹介して、質問者さんの返答は「ドロップダウンリストの絞り込みをご紹介いただいたリンクで実装できそうです!」ということでクローズされたのですが、SELECT クエリに WHERE 句を追加した以外はほとんど何も参考にされてないように見えます。

DropDownList を使って絞込み
http://surferonwww.info/BlogEngine/post/2011/07/17/Showing-records-selected-by-DropDownLists-into-GridView.aspx

紹介した記事のポイントは、SELECT クエリの WHERE 句を工夫する以外に、

(1) SqlDataSource を使う。

(2) SqlDataSource の SelectParameters に ControlParameter を追加し、DropDownList の SelectedValue が自動的に SELECT クエリのパラメータとして渡されるよう設定する。紹介した記事のコードで以下のようになっているところに注目してください。

<SelectParameters> <asp:ControlParameter ControlID="DropDownList1" Name="CustomerID" PropertyName="SelectedValue" /> <asp:ControlParameter ControlID="DropDownList2" Name="EmployeeID" PropertyName="SelectedValue" /> </SelectParameters>

そのようにすれば C# のコードは一行も書かずに、すべてウィザードベースで作ることができます。DropDownList の選択項目が変わった時の SELECT クエリの再発行や GridView のデータバインドは、すべて SqlDataSource が面倒を見てくれます。

SqlDataSource を使わない理由があるのでしょうか?

その前に、質問者さんが書かれた SELECT クエリが間違っているのは twck さんのご指摘の通りですので、まずそれを直す必要があります。

投稿2016/09/30 02:56

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

mogumogu

2016/10/01 00:43

SurferOnWwwさん 申し訳ありません、先日の投稿した質問の続きで合っています。 where句の式の作り方だけしか見えておらず、パラメータをselectクエリに渡す所まで見えていませんでした。 最初にGridviewのデータバインドをしていたため、混乱していました。Gridviewに紐付いているSqldatasourceにControlparameterを追加して、もう一度クエリ含め作り直してみます。 ありがとうございました。
guest

0

SQL文 の WHERE句 に書かれているパラメーターはシングルクォーテーションや大かっこで囲む必要がないと思うのですがこれで合ってますか?

たぶん (TPROJECT.NAME = N'[@NAME]') ではなく (TPROJECT.NAME = @NAME) ではないでしょうか?

あと ParameterName には @ が要らないはずです。
だから p5.ParameterName = "@NAME"; ではなく p5.ParameterName = "NAME"; ではないかと思うのですがどうでしょうか?

ちょっと今、実行環境がないので試せないのですが。

投稿2016/09/30 01:05

twck

総合スコア314

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

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

mogumogu

2016/10/01 00:53

twckさん @NAMEに修正してサーバで実行してみましたが、declare〜のSQLエラーが出てしまいました。 Parameternameの方は、デバッグで値を拾えたので、おっしゃる方法で合っておりました。ありがとうございます。 自分の書いたwhere句に問題がありそうなので、検証してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問