• 締切済み

ASP.NET,C#:カレンダーでDBを参照する際

protected void Calendar1_DayRender(object sender, DayRenderEventArgs e) { sds.SelectParameters.Clear(); sds.SelectParameters.Add("sdate", e.Day.Date.ToString("yyyy/MM/dd")); IDataReader reader = (IDataReader)sds.Select(DataSourceSelectArguments.Empty); while (reader.Read()) { Literal ltr = new Literal(); ltr.Text = String.Format( "<br />{0}",reader["subject"]); e.Cell.Controls.Add(ltr); } } いまいちこの処理で何をやっているのかがよくわかりません。 わかりやすくコメントを付けて頂けると助かります。 あと、DBにアクセスする際のSQL命令の"@"の意味がよくわかりません。 例:SELECT sdate FROM Schedule WHERE sdate = @sdate 初歩的な質問で申し訳ありませんが、よろしくお願いします。

みんなの回答

  • onos
  • ベストアンサー率81% (127/155)
回答No.1

> あと、DBにアクセスする際のSQL命令の"@"の意味がよくわかりません。 パラメーター化クエリとかパラメタライズドクエリ、と呼ばれるものですね。 このようなクエリを使うと、SQL文の実行時にパラメーターが設定されている形式として正しいかどうかをチェックしてくれるので、SQLインジェクションが防止されます。 ということで、問題のメソッドのほうですが ・すでについているパラメーターがあるかもしれないのでクリア ・今レンダリングしようとしている日付を新しくパラメーターとして設定 ・その設定でSQL文を実行 ・SQLが返す値があったら、値の数だけリテラルコントロールを動的に生成して、  そこにsubjectの値を表示 という処理が行われています。

houkago-tea
質問者

お礼

なるほど。 明確なご回答ありがとうございました。 今日からまた課題に取り掛かれます! こんな質問に答えて頂き、ありがとうございました!

関連するQ&A

  • 【C#】 データベース未使用でのレポートの表示

    初めまして。C#でどういても分からないことがあって質問させていただきました。 現在、VisualStadio2008でForm1で入力した値を、ボタンを押すことでActiveReport3.0に渡し、 Form2のViewerにセットしようと考えているところです。 public Form1() { InitializeComponent(); } private void print_Click(object sender, EventArgs e) { NewActiveReport1 report = new NewActiveReport1(); report.Run(); Form2 form2 = new Form2(); form2.setDocument(report.Document); form2.Show(); } private void Form1_Load(object sender, EventArgs e) { } public Form2() { InitializeComponent(); } public void setDocument(DataDynamics.ActiveReports.Document.Document doc) { this.viewer1.Document = doc; } private void viewer1_Load(object sender, EventArgs e) { } public void ActiveReport_DataInitialize() { this.Fields.Add("1lbl"); this.Fields.Add("2lbl"); this.Fields.Add("txt1"); this.Fields.Add("txt2"); } public bool ActiveReport_FetchData(object sender, DataDynamics.ActiveReports.ActiveReport. FetchEventArgs eArgs) { try { m_reader.Read(); Fields["1lbl"].Value = m_reader["lbl1"].ToString(); Fields["2lbl"].Value = m_reader["lbl2"].ToString(); Fields["txt1"].Value = m_reader["txt1"].ToString(); Fields["txt2"].Value = m_reader["txt2"].ToString(); eArgs.EOF = false; } catch { eArgs.EOF = true; } return eof; } これをデバッグして、ボタンを押すと強制終了して、[ report.Run(); ]に 「Report Script Compile Error on line 15 Error = 型または名前空間名 'ActiveReport' は 名前空間 'DataDynamics.ActiveReports' に存在しません。アセンブリ参照が不足しています。」 と、表示されてしまいます。どうしたらよいでしょうか? タイトルの通り、DB接続は行いません。また、Form1にはlabel2個、TextBoxが2個セットしてあります。

  • DataSet(DataTable)の使い方

    GridViewやListViewなどに動的にデータを追加していきたいので、 DataTableを使おうと思いました。 下記、(1)のようにPageLoadイベントで1行追加することはできたのですが、 ボタンを押すごとに、1行ずつ追加していきたいので(2)のように修正したのですが、 ボタンを押したときのポストバックで、DataSetもDataTableもnullになってしまい、 行の追加ができません。 ボタンを押すごとにどんどん行を追加していきたいのですが、このような場合は どのようにDataSetもDataTableを保持しておけば良いのでしょうか。 (1) public partial class WebForm1 : System.Web.UI.Page { int count = 0; protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { DataSet dS = new DataSet("dS"); DataTable dT = new DataTable("dT"); // データテーブル カラム作成 dT.Columns.Add("no", typeof(int)); dT.Columns.Add("name", typeof(string)); dT.Columns.Add("kind", typeof(string)); dT.Columns.Add("time", typeof(int)); dS.Tables.Add(dT); DataRow dR = dT.NewRow(); dR["no"] = count; dR["name"] = count.ToString(); dR["kind"] = count.ToString(); dR["time"] = count; dT.Rows.Add(dR); // リストビュー データソース選択 ListView2.DataSource = dS; ListView2.DataBind(); } } } (2) public partial class WebForm2 : System.Web.UI.Page { int count = 0; DataSet dS; DataTable dT; protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { dS = new DataSet("dS"); dT = new DataTable("dT"); // データテーブル カラム作成 dT.Columns.Add("no", typeof(int)); dT.Columns.Add("name", typeof(string)); dT.Columns.Add("kind", typeof(string)); dT.Columns.Add("time", typeof(int)); dS.Tables.Add(dT); } } protected void Button1_Click(object sender, EventArgs e) { count = count + 1; DataRow dR = dT.NewRow(); dR["no"] = count; dR["name"] = count.ToString(); dR["kind"] = count.ToString(); dR["time"] = count; dT.Rows.Add(dR); // リストビュー データソース選択 ListView2.DataSource = dS; ListView2.DataBind(); } }

  • ASP.NET C#で

    ASP.NET C#で重複登録されないようにStreamReaderで読み込んで確認後重複がなければ StreamWriterで書き込むというプログラムを書いていたのですが、重複確認もcsvファイルへの書き込むもエラーが表示されて出来ませんでした。 sr.Close();の位置を変えても変わりませんでした。 エラー内容 ・System.ObjectDisposedException はユーザー コードによってハンドルされませんでした。 Message=閉じている TextReader から読み取ることはできません。 他にも、他のプロセスに使われているため・・・と言ったエラーも表示されます。 ソースコード protected void Button1_Click(object sender, EventArgs e) { string Searchid = TextBox1.Text;//商品コード //ファイルの存在を確認 if (!File.Exists(MapPath(".") + "\\Data\\product.csv")) { Label2.Text = "データ登録先が存在しません。管理者に連絡してください。"; return; } this.Label1.Text = string.Empty; //確認ここまで StreamReader sr = new StreamReader(MapPath(".") + "\\Data\\product.csv", true); while (sr.Peek() != -1) { string date = sr.ReadLine(); char[] delimiter = new char[] { ',' }; string[] item = date.Split(delimiter); string id = item[0]; sr.Close(); if (Searchid.Equals(id)) { Label1.Text = "既に存在する商品コードです。別の商品コードを指定してください。"; } else { Session["scode"] = TextBox1.Text;//商品コード Session["sname"] = TextBox2.Text;//商品名 Session["price"] = TextBox3.Text;//価格 StreamWriter sw = new StreamWriter(MapPath(".") + "\\Data\\product.csv", true, Encoding.GetEncoding("Shift_jis")); sw.WriteLine(TextBox1.Text + "," + TextBox2.Text + "," + TextBox3.Text);//商品コード+商品名+単価 sw.Close(); Label1.Text = "正常に登録出来ました。"; } } } どのようにしたら実行出来るのでしょうか? 教えて下されば幸いです。

  • DGV/子フォームで編集して親フォームへ

    親フォームと子フォーム、どちらにもDataGridViewを用意し、親フォームのセレクト行を子フォームに表示するというプログラムがあります。 さらに子フォームで直接DataGridViewに入力し編集して、更新ボタンを押して親フォームに反映させたいです。(関数を使いたい) ご教授お願いします(´;ω;`) Form1 private void DataGridView1_SelectedRowsDoubleClick(Object sender, MouseEventArgs e) { Form2 f2 = new Form2(); f2.setRowData(dataGridView1.SelectedRows); f2.Show(); } Form2 public void setRowData(DataGridViewSelectedRowCollection rows) { DataTable dt = createData(); foreach (DataGridViewRow r in rows) { string s1 = r.Cells[1].Value.ToString(); string s2 = r.Cells[2].Value.ToString(); string s3 = r.Cells[3].Value.ToString(); dt.Rows.Add("12345", s1, s2, s3); } dataGridViewDisp2(dt); } private void savebtn_Click(object sender, EventArgs e) { }

  • Page_Load時にボタンクリックイベントを実行するには?

    ASP.NETでPage_Load時にボタンクリックイベントを実行するにはどのようにすればいいのでしょうか? 具体的には、HTTPクエリ文字列のresultが"1"の場合はbutton1_Clickイベントを実行したいのですが、やりかたが分かりません。 サンプルソースの★の部分に button1_Click(sender, System.Web.UI.ImageClickEventArgs.Empty) と入れたら、 「型 'System.EventArgs' のオブジェクトを型 'System.Web.UI.ImageClickEventArgs' にキャストできません。」 というエラーメッセージが表示されてしまいます。 ■■■■■■サンプルソース■■■■■■ Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load   'クエリー取得(数値チェック)   If Request.QueryString("result").ToString = "1" Then     '検索ボタン押下処理を表示する     ★button1_Clickイベントを実行したい。   End If End Sub '検索ボタン押下 Protected Sub button1_Click(ByVal sender As Object, ByVal e As System.Web.UI.ImageClickEventArgs) Handles button1.Click '検索結果を表示する     : End Sub

  • C#で動的に配置したコントロール

    はじめまして 開発歴1年未満の開発者ですがよろしくお願いします。 開発環境 Visual Studio 2008 C# ASP.NET protected void Page_Load(object sender, EventArgs e) { TextBox TextBox = new TextBox(); TextBox.ID = "TextBox1"; TextBox.Text = "C# ASP.NET"; form1.Controls.Add(TextBox); } protected void Button1_Click(object sender, EventArgs e) { string strTextBox1 = ??????? } と上記のように読み込み時に、テキストボックスのみを動的に配置し、デザイナで配置したのボタンを押した際に、テキストボックスに入力された値を、取得したいのですが、方法がわかりません・・・ お忙しいとは、思いますがご回答よろしくお願いします。

  • ASP.NET2.0 TreeView チェックボックス

    皆様、お世話になります。 長田と申します。 環境はASP.NET2.0です。 1.新規にWebフォームを作成して、その中にTreeViewとボタンを作成します。 2.TreeViewはチェックボックスを持つように設定。 3.ボタン押下時にTreeViewの中でチェックボックスを選択されているものを取得して、ラベルに表示。 ネットにてサンプルを見つけたのですが、C#なため解読できません。(泣く VB.NETでしたらどのようになりますでしょうか宜しければご教授頂きたく思ってます。 ご指導お願い致します。 TreeViewイメージ □大分類A  □中分類1   □小分類1   □小分類2   □小分類3  □中分類2   □小分類1   □小分類2   □小分類3 □大分類B  □中分類1   □小分類1 コード(※ツリービューを作る所は省略) //ボタン押下時 protected void Button1_Click(object sender, EventArgs e) {   System.Text.StringBuilder sb = new System.Text.StringBuilder();   //大分類   sb.Append(SelectNode(TV1.Nodes));   foreach (TreeNode tn in TV1.Nodes)   {     //中分類     sb.Append(SelectNode(tn.ChildNodes));     foreach (TreeNode tn2 in tn.ChildNodes)     {       //小分類       sb.Append(SelectNode(tn2.ChildNodes));     }   }   Label1.Text = sb.ToString(); } //ノードに日もづく子ノードで且つ選択されているものを取得 public static string SelectNode(TreeNodeCollection tnc) {   System.Text.StringBuilder sb = new System.Text.StringBuilder();   foreach (TreeNode tn in tnc)   {     if (tn.Checked)     {       sb.Append(tn.Text);     }   }   return sb.ToString(); }

  • スケジュール登録でのユーザー情報取りだし方法

    お世話になります。 現在jsp javascript でスケジュール管理プログラムを作っていますが、スケジュールの日付を指定するとすべてのスケジュール(ログイン時でも他ユーザーのスケジュールも表示される。) ことになってしまいますが、そうならないためにスケジュール登録の時にログイン時のユーザー情報 (ユーザー名、ID,パスワード)を取り出すにはどのような処置をすればよろしいでしょうか? 下記ソースです。(文字コード指定等省略してる部分があります。) スケジュール登録1 文字コード指定 <%! private String createOption(int start,int end){ StringBuffer builder = new StringBuffer(); for(int i=start;i<=end;i++){ builder.append("<option value ='"+i+"'>"+i+"</option>"); } return builder.toString(); } %> <html> <head> <title>スケジュール新規登録1</title> </head> <body> <form action="ScheduleToroku2.jsp" method="POST"> <tr> <td> <h3>スケジュールを登録したい日付を選択してください。</h3> </td> <th align="right">日付:</th> <td> <select name="sdate_year"><%=createOption(2000,2030)%></select>年 <select name="sdate_month"><%=createOption(1,12)%></select>月 <select name="sdate_day"><%=createOption(1,31)%></select>日 </td> <td> <h3>登録したい内容を入力してください。</h3> </td> <td> <textarea name="memo" rows="5" cols="40"></textarea> </td> <td> <h3>開始時間を選択してください。</h3> </td> <td> <select name="start_hour"><%=createOption(0,23)%></select>時 <select name="start_minute"><%=createOption(0,50)%></select>分 </td> <td> <h3>終了時間を選択してください。</h3> </td> <td> <select name="end_hour"><%=createOption(0,23)%></select>時 <select name="end_minute"><%=createOption(0,59)%></select>分 </td> スケジュール登録2 <% /*スケジュール登録1からデータを取得*/ String date=request.getParameter("sdate_year")+"-"+request.getParameter("sdate_month")+"-"+request.getParameter("sdate_day"); String memo=request.getParameter("memo"); String s_hour=request.getParameter("s_hour"); String s_minute=request.getParameter("s_minute"); String e_hour=request.getParameter("e_hour"); String e_minute=request.getParameter("e_minute"); if(Integer.parseInt(s_hour)>Integer.parseInt(s_hour)){ %> 下記スケジュール1の登録内容

  • VB2005 Datagridview の仮想モードでメモリリーク

    VB2005にてDatagridviewの仮想モードを実装しています。 DataGridviewを全件ループ処理する場合にメモリが増加します。完了してもそのままメモリが減りません。これを回避する方法がありますか?CellValueNeededはメモリを消費し続けるものなのでしょうか。 実際のプログラムでは件数が多い場合にメモリの消費が止まらずメモリ不足に陥ります。 以下は単純なコードにしたサンプルです。これでもデバッグモードで動かすと起動時20Mくらいのメモリ消費がループ処理時に100Mくらいにに増えます。 ※実際の処理でバインドしているデータ(datatable等)の方をループさせるという代替案がありますが、今回はdatagridviewから行った結果のメモリ不足についてご教授いただければと思います。 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load With Me.DataGridView1 .Columns.Add("Column1", "列1") .Columns.Add("Column2", "列2") .Columns.Add("Column3", "列4") .Columns.Add("Column4", "列4") .Columns.Add("Column5", "列5") .Columns.Add("Column6", "列6") .Columns.Add("Column7", "列7") .VirtualMode = True .RowCount = 100000 End With End Sub Private Sub DataGridView1_CellValueNeeded(ByVal sender As Object, _ ByVal e As System.Windows.Forms.DataGridViewCellValueEventArgs) _ Handles DataGridView1.CellValueNeeded e.Value = e.RowIndex.ToString & "," & e.ColumnIndex.ToString End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click For i As Integer = 0 To DataGridView1.Rows.Count - 1 DataGridView1.Rows(i).Cells(1).Value = DataGridView1.Rows(i).Cells(2).Value Next MsgBox("終了") End Sub

  • asp.netでのセッションを使用したログイン

    asp.netでmssql server を利用してログイン機能を実装しました。 以下のようなコードでmssqlに保存してあるIDとパスが一致すれば 以降の画面ではセッションにID、パスが保存され page loadでセッションにID、パスがなかればページがすすんでいけないような設定にしています。 機能は問題なく動作しているのですがこのような仕様はセキュリティ上問題はないのでしょうか。 商用サイトではないのですが、ある程度広域に向けたサイトを構築しようと考えておりまして、セキュリティ向上のため、工夫できるようなことがあればご意見いただきたいです。 よろしくお願いいたします。 ************************************************************** ログインページ ************************************************************** Dim staffid As Integer Dim staffname As String Dim adminflag As Boolean Protected Sub btnLogon_Click(ByVal sender As Object, ByVal e As System.EventArgs) 'ユーザーIDの入力チェック If txtUserID.Text = "" Then lblErr.Text = "ユーザーIDを入力してください。" Return End If 'パスワードの入力チェック If txtpassword.Text = "" Then lblErr.Text = "パスワードを入力してください。" Return End If 'ユーザーとパスワードの検証 If Not CheckUserPassword(txtUserID.Text, txtpassword.Text) Then lblErr.Text = "ユーザーIDまたはパスワードが違います。" Return End If 'セッション変数へ値をセットする Session("StaffID") = staffid Session("StaffName") = staffname Session("AdminFlag") = adminflag End Sub Private Function CheckUserPassword(ByVal userid As String, ByVal password As String) As Boolean Dim ret As Boolean Dim strSQL As String strSQL = "SELECT staffID, staff_name, admin_flag , permission FROM tbl_staff " & _ "WHERE userID = '" & userid.Replace("'", "''") & _ "' AND password = '" & password.Replace("'", "''") & "'" '接続文字列を取得する Dim cnStr As String = System.Configuration.ConfigurationManager.ConnectionStrings("hogehogeConnectionString").ConnectionString() 'コネクションを定義する Using connection As New SqlConnection(cnStr) 'コマンドを定義する Dim command As New SqlCommand(strSQL, connection) 'コネクションを開く connection.Open() Try 'コマンドからデータリーダーを定義する Dim dr As SqlDataReader = command.ExecuteReader 'データリーダーから結果を読み込む If dr.Read Then '対象データが存在する場合 '正しいユーザーIDとパスワードが指定されたので、 'データリーダーから読み出したデータをメンバ変数にセットする staffid = dr("staffID") staffname = dr("staff_name") adminflag = dr("admin_flag") permission = dr("permission") ret = True Else '対象データが存在しない場合 '不正なユーザーIDまたはパスワードが指定された ret = False End If Catch ex As Exception '例外処理(SQLエラーなど) ret = False End Try 'コネクションを閉じる connection.Close() End Using '結果を返して終了する Return ret End Function ************************************************************** ログイン後に行くページでの設定 ************************************************************** Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) '[ユーザーID]ボックスにフォーカスをセットする If Session("StaffID") Is Nothing Then Response.Redirect("~/top.aspx") ElseIf Not Session("AdminFlag") = True Then Response.Redirect("~/top_normal.aspx") End If End Sub

専門家に質問してみよう