ASP.NETの最近のブログ記事
ファイルダウンロードダイアログを表示する方法です。
下記例では、test.pdfファイルをダウンロードしようとしています。
レガシーASPと変わらないですね。
下記例では、test.pdfファイルをダウンロードしようとしています。
Dim strFile As String = "./File/test.pdf"
Response.AddHeader("Content-Disposition", "attachment; filename=test.pdf")
Response.ContentType = "application/octet-stream"
Response.Flush()
Response.WriteFile(strFile)
Response.End()
Response.AddHeader("Content-Disposition", "attachment; filename=test.pdf")
Response.ContentType = "application/octet-stream"
Response.Flush()
Response.WriteFile(strFile)
Response.End()
レガシーASPと変わらないですね。
Web.configにはアクセスできないとしても、データベースの接続文字列等が含まれているので少々不安です。ASP.NET2.0からファイルを暗号化できるようになりました。しかもセクションごとに暗号化することも可能です。
暗号化にはASP.NET IIS 登録ツール (Aspnet_regiis.exe)を使います。
コンソールを開いて以下のコマンドを入力。
> aspnet_regiis -pef "暗号化するセクション" Web.configのあるフォルダ
※aspnet_regiis.exeは.NET Framework2.0ではC:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 フォルダにあります。
では、connectionStringsセクションを暗号してみます。Web.configは、D:\workにあるものとします。
>aspnet_regiis -pef "connectionStrings" D:\work
Encrypting configuration section...
Succeeded! ←暗号化成功です!
暗号化を戻すには、-pdf オプションを使います。
ASP.NET IIS 登録ツール (Aspnet_regiis.exe)
http://msdn.microsoft.com/ja-jp/library/k6h9cz8h(VS.80).aspx
暗号化にはASP.NET IIS 登録ツール (Aspnet_regiis.exe)を使います。
コンソールを開いて以下のコマンドを入力。
> aspnet_regiis -pef "暗号化するセクション" Web.configのあるフォルダ
※aspnet_regiis.exeは.NET Framework2.0ではC:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 フォルダにあります。
では、connectionStringsセクションを暗号してみます。Web.configは、D:\workにあるものとします。
>aspnet_regiis -pef "connectionStrings" D:\work
Encrypting configuration section...
Succeeded! ←暗号化成功です!
暗号化を戻すには、-pdf オプションを使います。
ASP.NET IIS 登録ツール (Aspnet_regiis.exe)
http://msdn.microsoft.com/ja-jp/library/k6h9cz8h(VS.80).aspx
GriedViewで例えばユーザ名称をリンクにしておいてユーザIDをパラメータに渡したい場合、
DataNavigateUrlを使います。
DataNavigateUrlFieldsには、パラメータに設定する項目を指定します。
DataNavigateUrlFormatStringに遷移先のURLにパラメータをつけて指定します。
DataNavigateUrlを使います。
<asp:HyperLinkField
DataNavigateUrlFields="UserID"
DataTextField="UserName"
HeaderText="ユーザ名"
DataNavigateUrlFormatString="~/Default2.aspx?prm={0}"/>
DataNavigateUrlFormatStringに遷移先のURLにパラメータをつけて指定します。
ASP2.0でのファイルアップロードの方法は簡単です。デザイン画面でFileUploadコントロール、Button、Labelをドラッグ&ドロップします。

アップロードボタンのClickイベントに以下のように記述するだけです。

アップロードボタンのClickイベントに以下のように記述するだけです。
If FileUpload1.HasFile Then
FileUpload1.SaveAs("d:\work2\" & FileUpload1.FileName)
Else
Label1.Text = "ファイルを正しく選択してください。"
End If
HasFileプロパティでファイルがFileUploadコントロールに格納されているかどうかを確認します。HasFileプロパティがTrueであればSaveAsメソッドにアップロード先のパスを指定するのみです。FileUpload1.SaveAs("d:\work2\" & FileUpload1.FileName)
Else
Label1.Text = "ファイルを正しく選択してください。"
End If
データセットの各項目へのアクセス方法について紹介します。
まずは、レコード件数です。
次は、テーブルの各項目へのアクセス方法です。
先頭レコードの一番はじめのフィールドへの参照は以下のようになります。
まずは、レコード件数です。
Dim da As SqlDataAdapter = New SqlDataAdapter(sqlStr, connStr)
Dim ds As DataSet = New DataSet
da.Fill(ds)
'レコード件数チェック
If ds.Tables(0).Rows.Count = 0 Then
Response.Write("データはありません。")
End If
SQLの発行が1つであればTable(0)となります。複数のSQLを発行している場合にTables(index)で参照できます。Dim ds As DataSet = New DataSet
da.Fill(ds)
'レコード件数チェック
If ds.Tables(0).Rows.Count = 0 Then
Response.Write("データはありません。")
End If
次は、テーブルの各項目へのアクセス方法です。
先頭レコードの一番はじめのフィールドへの参照は以下のようになります。
ds.Tables(0).Rows(0)(0)
データアダプタは、データベースとデータセットの橋渡しを行うようなものです。
ここでは、SQLServerに接続してGrideViewへの表示を行います。
まずは、aspxファイルのデザイン画面にGridViewをドラッグ&ドロップします。これだけであとは、vbファイルに以下のコードを記述します。
ここでは、SQLServerに接続してGrideViewへの表示を行います。
まずは、aspxファイルのデザイン画面にGridViewをドラッグ&ドロップします。これだけであとは、vbファイルに以下のコードを記述します。
Dim connStr As String = "Data Source=(local);Initial Catalog=test;User ID=testUsr;Password=pass"
Dim sqlStr As String = "SELECT * FROM [User]"
Dim da As SqlDataAdapter = New SqlDataAdapter(sqlStr, connStr)
Dim ds As DataSet = New DataSet
da.Fill(ds)
GridView1.DataSource = ds
GridView1.DataBind()
これで表示できてしまいます。
Dim sqlStr As String = "SELECT * FROM [User]"
Dim da As SqlDataAdapter = New SqlDataAdapter(sqlStr, connStr)
Dim ds As DataSet = New DataSet
da.Fill(ds)
GridView1.DataSource = ds
GridView1.DataBind()
前回はODBCでの接続でしたが、今回はパフォーマンスがより良いとされている、Connector/Netでの接続を行います。
まずはConnector/Net 5.1をこちらからダウンロードしてインストールします。
次にVS2005のプロジェクトに参照の設定をします。
メニュー→Webサイト→参照の追加→.NETタブの中の、MySQL.Dataを選択してOKボタンをクリックします。
これでvbファイルでImportの記述が行えます。
これでMySQLからデータを取得してGridViewに表示されます。
まずはConnector/Net 5.1をこちらからダウンロードしてインストールします。
次にVS2005のプロジェクトに参照の設定をします。
メニュー→Webサイト→参照の追加→.NETタブの中の、MySQL.Dataを選択してOKボタンをクリックします。
これでvbファイルでImportの記述が行えます。
Dim conn As
MySqlConnection
Dim ds As New
DataSet()
Dim da As New MySqlDataAdapter()
'接続文字列
Dim connStr As String =
"Database=bookmark;Data Source=localhost; _
User
Id=user;Password=pass"
da.SelectCommand = New MySqlCommand("SELECT * FROM items", conn)
'DataSetに格納
da.Fill(ds)
'GridViewへバインド
GridView1.DataSource = ds
GridView1.DataBind()
GridViewの更新はCommandFieldを追加するだけで簡単にできますが、MySQLだとそうはいきません。データソース構成ウィザードでUpdateCommandをうまく作れないためです。
ということでここでは、コードからGridViewを更新する方法をご紹介します。SQLServerであればこんなことは不要なんですけどね。
ここで紹介する画面イメージは以下のようになっています。

更新したい項目をTemplateFieldにしておきます。GridViewの列の編集から開くダイアログでフィールドを選択して「このフィールドを TemplateField に変換します。」リンクをクリックします。

これで基本的には準備完了です。あとはコードを書きます。どのイベントに書くかというと、GridViewのRowUpdaingに記述します。
ということでここでは、コードからGridViewを更新する方法をご紹介します。SQLServerであればこんなことは不要なんですけどね。
ここで紹介する画面イメージは以下のようになっています。

更新したい項目をTemplateFieldにしておきます。GridViewの列の編集から開くダイアログでフィールドを選択して「このフィールドを TemplateField に変換します。」リンクをクリックします。

これで基本的には準備完了です。あとはコードを書きます。どのイベントに書くかというと、GridViewのRowUpdaingに記述します。
Protected Sub GridView1_RowUpdating(ByVal sender As Object, ByVal e As _
System.Web.UI.WebControls.GridViewUpdateEventArgs) Handles GridView1.RowUpdating
'更新対象の行をGridViewRowオブジェクトとして取得
Dim row As GridViewRow = GridView1.Rows(e.RowIndex)
'TemplateFieldのTextBoxのIDを指定して取得
Dim url As TextBox = CType(row.FindControl("TextBox1"), TextBox)
Dim title As TextBox = CType(row.FindControl("TextBox2"), TextBox)
Dim desc As TextBox = CType(row.FindControl("TextBox3"), TextBox)
'UpdateCommand設定
SqlDataSource1.UpdateCommand = "UPDATE bookmark.items SET url = ?, title = ?, _
description = ? WHERE (id = ?)"
'各パラメータを設定
SqlDataSource1.UpdateParameters.Add("param1", CStr(url.Text))
SqlDataSource1.UpdateParameters.Add("param2", CStr(title.Text))
SqlDataSource1.UpdateParameters.Add("param3", CStr(desc.Text))
SqlDataSource1.UpdateParameters.Add("param4", CStr(row.Cells(0).Text))
End Sub
これで更新が可能になります。
System.Web.UI.WebControls.GridViewUpdateEventArgs) Handles GridView1.RowUpdating
'更新対象の行をGridViewRowオブジェクトとして取得
Dim row As GridViewRow = GridView1.Rows(e.RowIndex)
'TemplateFieldのTextBoxのIDを指定して取得
Dim url As TextBox = CType(row.FindControl("TextBox1"), TextBox)
Dim title As TextBox = CType(row.FindControl("TextBox2"), TextBox)
Dim desc As TextBox = CType(row.FindControl("TextBox3"), TextBox)
'UpdateCommand設定
SqlDataSource1.UpdateCommand = "UPDATE bookmark.items SET url = ?, title = ?, _
description = ? WHERE (id = ?)"
'各パラメータを設定
SqlDataSource1.UpdateParameters.Add("param1", CStr(url.Text))
SqlDataSource1.UpdateParameters.Add("param2", CStr(title.Text))
SqlDataSource1.UpdateParameters.Add("param3", CStr(desc.Text))
SqlDataSource1.UpdateParameters.Add("param4", CStr(row.Cells(0).Text))
End Sub
MySQLへの接続をODBCで試してみたところ、文字化けした。。DBの文字コードはUTF-8にしてあるのにだめでした。
環境:XP Pro, VS2005, MySQL5.0, ODBC3.51(MySQLはWin, Linux両方試した)
ただODBCを5.1にしたらWin,Linuxどちらも文字化けせず。。
ちなみにSqlDataSourceの構成ウィザードでもSQLServerのように単純にはいきません。
Selectステートメントの構成では”カスタム”を選ばないとエラーになる。

SQLは直接記述するか、クエリビルダを使います。UPDATE, INSERT, DELETEはウィザードではうまくいきません。コードに記述することになります。

最後にクエリのテストをクリックして結果を確認します。文字化けする場合はここで文字化けします。

これで設定完了です。
環境:XP Pro, VS2005, MySQL5.0, ODBC3.51(MySQLはWin, Linux両方試した)
ただODBCを5.1にしたらWin,Linuxどちらも文字化けせず。。
ちなみにSqlDataSourceの構成ウィザードでもSQLServerのように単純にはいきません。
Selectステートメントの構成では”カスタム”を選ばないとエラーになる。

SQLは直接記述するか、クエリビルダを使います。UPDATE, INSERT, DELETEはウィザードではうまくいきません。コードに記述することになります。

最後にクエリのテストをクリックして結果を確認します。文字化けする場合はここで文字化けします。

これで設定完了です。
設定ファイルなどを拡張子がtxt, ini, datなどのファイルにしている場合、このファイルにアクセスされると
ブラウザに内容が表示されてしまう。
それに対してアクセス制限をかけるには、web.configのhttpHandlers要素に追加すればよい。
以下はtxtファイルを制限する場合の記述。
ただしVS2005の開発環境で確認する場合はこれで問題ありませんが、 実際にWindows2003Serverにリリースした際は、これだけではtxtファイルは表示されてしまいます。
これの対処方法は、IISに設定を追加する必要があります。
<configuration>
<system.web>
<httpHandlers>
<add verb="*" path="*.txt" type="System.Web.HttpForbiddenHandler" />
</httpHandlers>
</system.web>
</configuration>
ただしVS2005の開発環境で確認する場合はこれで問題ありませんが、 実際にWindows2003Serverにリリースした際は、これだけではtxtファイルは表示されてしまいます。
これの対処方法は、IISに設定を追加する必要があります。
