2007年07月05日

CSV出力時の不具合

GridViewに表示した内容をCSV出力する処理を作っていてちょっと困った現象があったので、それを今回のTipsとして紹介する。

といってもCSV出力自体の方法ではない、出来上がったCSV出力データを開いたり保存したりする時の問題である。

CSV作成完了

上記画面が出た後、「開く」や「保存」を選んでも下図の画面から先に一向に進まないのである。

ダウンロード中

このとき、一度「キャンセル」させて再度実行すると次からは正常に開いたり保存できたりするのだ。
ユーザーに一度キャンセルしてくださいなどと言い訳するわけにもいかないのでいろいろ調べてみたがどうやっても直らない。
そこで、この問題とは関係なくもともとCSV出力時に確認ダイアログをつける予定だった処理を付け加えたところ、何とそれによって問題はあっさり解決した。

その処理は、下図のようにボタンにJavaScriptを追加するものである。

クリックイベントでダイアログ表示

こうすることで出力ボタンを押すと

確認ダイアログ

が表示され、これ以降は正常に処理が進むのである。

ただ、本当の原因は別なところにあるようで、このワンクッションを付けなくても正常に進む場合もあった。
そういうわけで、もし途中で止まるような場面があったらこうしたらというTipsです。


posted by なっちゃん at 14:05| 静岡 ☔| Comment(2) | TrackBack(0) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする

2007年06月27日

外部Javascriptでまた同じ過ちを・・・Javascriptのデバッグ方法

以前「ASP.NETでJavascriptを外部ファイルにする場合の注意」というTipsを書いたが、また同じ過ちをしてしまった。

文字コードがUTF-8になっていないためのエラーだった。ただ今度の場合、開発環境のWindowsXPでは正常に動作していたので、ユーザーの運用環境であるWindowsServer2003でエラーをしたときもそれが原因だとは思わなかった。
インターネットで見つけたJavascriptのサンプルを一部修正して使ったのだが案の定Shift-JISで保存されたものだった。一部に日本語が使われていたが、正常に動作してたためそのまま使っていたのだ。
それがWindowsServer2003では読み込み時にエラーして全く使えない状態になり(下図)、

読み込み時エラー発生

そこで初めて問題に気が付いたわけである。しかも自分で書いた以前のTipsのことをすっかり忘れていて数時間無駄に原因を調べていた。が、このときJavascriptのデバックの方法を見つけたのが唯一の収穫でもあった。

Javascriptをデバッグするときこれまで良く使ったのはalert文を使って途中で止めることだった。これだと予想されるバグの発生場所にいくつもalertを書いていかなくてはいけないので結構面倒だった。
それが、次の方法で不要になる。ただしブラウザはIEに限るが。

インターネットオプション−詳細

IEのインターネットオプションの「詳細設定」で上図のように「スクリプトのデバッグを使用しない(Internet Explorer)」のチェックを外す。こうするとエラーの発生した場所(行番号)とエラー内容を表示してくれる。(下図)

Javascriptのデバッグ

エディタ画面にもその外部Javascriptソースが開きカーソルが点滅している。

ともかく外部Javascriptは必ずUTF-8で保存しておこう
posted by なっちゃん at 10:54| 静岡 🌁| Comment(0) | TrackBack(0) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする

2007年06月21日

消えたテンプレート

いつものように、プロジェクトにWebフォームを追加しようとして「新しい項目の追加」を開いたところ・・・無い!テンプレートから「Webフォーム」が消えている!!(下図)

Webフォームが消えてしまったテンプレート一覧
Webフォームが消えたテンプレート

ここ数日別の作業をしていてフォームの追加はしていなかったが、テンプレートから消えるなんてことは一度も無かった。これじゃ仕事にならんではないか!

怒っても仕方が無いので原因と対策を調べてみたが、マイクロソフトのヘルプ「テンプレートの問題を解決する」では、自作のテンプレートのことを言っているので元々提供されているテンプレートが消えた今回の場合には当てはまらない。

結局、VisualStudio2005を修復セットアップして回復した。よく見るとWebフォーム以外にも(いつの間にか)消えていたらしいテンプレートもあることが分かった。何で消えるのだろう?

きれいに復帰したテンプレート一式
テンプレートが元通りになった
posted by なっちゃん at 20:53| 静岡 ☁| Comment(0) | TrackBack(0) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする

2007年06月14日

AJAX Control Toolkitの「Calendar」の月が日本語にならないのは

ASP.NET AJAX Control Toolkitの中からCalendarを使ってみた。

月が英語表記になっている

とても便利なのだが、月の表記が英語になってしまう。
サンプルではちゃんと日本語になるのに、自分の作ったページではどういうわけか英語表記になってしまう。

半日ほど調べまわってようやく、サイトのサンプルの下に英語で何やら書いてあるのを見つけた。これによるとページの国別属性Cultureの設定が必要だということ。ページ単位なら@Pageディレクティブにサイト全体ならWeb.Configに設定するようだ。
試しにWeb.Configに設定してみた。

カルチャー設定

でもやっぱり英語表記のままだった(--;
もう一度説明を見るとCulture設定を有効にするには、さらにAJAXのScriptManagerのプロパティ「EnableScriptGlobalization」「EnableScriptLocalization」を有効にする必要があると書かれていた(^^;

ScriptManagerのプロパティ設定

以上の設定をしたところ、やっと日本語表記になった!
しかも曜日も日本語になっている。

月が日本語になっている

※ちなみに、ScriptManagerのプロパティを有効にすれば、Culture設定はあえて記述しなくても日本語表記になることも判った。
posted by なっちゃん at 10:21| 静岡 ☔| Comment(3) | TrackBack(2) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする

2007年05月08日

Webアプリケーションの全画面表示と最大化表示

Webアプリケーションはブラウザを使うのでそのままではメニューバー・ツールバー・アドレスバーなどの余分な領域がある。
これを消したほうが画面も広く取れるし、オペレーションとは関係ない操作を未然に防ぐことができる。
これらを消すには一般的にJavascript(window.open)を使うのだが、困ったことに最初の起動時に使えない(消すことができない)。そこでワンクッション(起動用フォームを)入れる必要がある。

サンプル (ソースはこちら->WindowOpen.lzh)

1.起動メニュー
※この起動フォームは全画面と最大化をボタンで選択するが、どちらか一方を固定すればonload時に自動的にメインフォームへ飛ばすことも可能。

起動フォーム

2.全画面表示
全画面表示

3.最大化表示
最大化表示


Javascriptの使い方(全画面・最大化)

1.起動フォーム(Default.aspx)
起動フォームのJavascript

2.メインフォーム(Default2.aspx)
メインフォームのJavascript
続きを読む
posted by なっちゃん at 14:44| 静岡 ☔| Comment(1) | TrackBack(0) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする

2007年05月07日

現場で使えるTipsが豊富なASP.NET2.0参考書

ASP.NET2.0 Webアプリケーション開発入門」は、現場で使えるTipsが豊富な参考書で大変重宝した。
特にFormViewの使い方で悩んでいたときに書店で見つけ、DropDownListとGridViewとの連携などデータコントロール(GridView/DetailsView/FormView他)を使った様々な事例をTipsに紹介してくれている。
初心者向けというより、コントロールを使いこなしたい人向けといえる。

注意として、サンプルをダウンロードしてもそのままではエラーして使えなかった。新規プロジェクトでコードを貼り付けたりしていくと動く。(ダウンロードサイトにはその辺の説明があるが、それでも動かなかった)

Tipsの紹介(一例)
・DropDownListの先頭に「選択してください」を表示する
・GridViewの列がNullのとき特定の文字列を表示する
・GridViewのヘッダーを固定してスクロールする
・GridViewの列をフォーマットするときの注意事項
・DetailsViewの区分IDの代わりに区分名を表示するには
・DetailsViewの区分IDの変わりに区分名(DropDownList)を表示するには



ASP.NET 2.0 Webアプリケーション開発入門
ASP.NET 2.0 Webアプリケーション開発入門
葛西 秋雄

関連商品
Microsoft Visual Studio 2005によるWebアプリケーション構築技法
Pocket詳解 ASP.NET辞典
プロが作った!すぐに使える! ASP.NET 2.0 実践サンプル集
10日でおぼえるASP.NET 2.0 入門教室
ひと目でわかるMicrosoft SQL Server 2005
by G-Tools

posted by なっちゃん at 13:39| 静岡 ☔| Comment(0) | TrackBack(2) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする

動的にフォルダを作成し、ファイルをアップロード

ファイルアップロードのサンプルはヘルプを含め、いろんなところに掲載されている。でもほとんどが固定されたフォルダにアップするようになっている。
これを任意のフォルダ(と言ってもアクセス可能な)に動的に作成したフォルダへアップしたいときにどうすれば良いか。
ASP.NET以前の旧ASPでWebアプリを作ったときは「FileSystemObject」を使ってサーバー上のドライブやフォルダを操作していた。それが今回使えるかどうか試してみたら、何の問題も無く使えた。同時にASP.NET時代の方法も試してみた。こちらも当然問題無く可能だ。

補足:
このTipsを公開直後、かるあさんから指摘がありましたFileSystemObjectを使った場合のCOM参照の開放を追加しました。
COMオブジェクトの管理についてはMicrosoftのこちらのページを参考にご覧ください。→相互運用機能アセンブリを使った複雑な COM オブジェクトの処理

'フォルダ名に日時を使った文字列を使用
Dim mFolder As String = Format(Now, "yyyyMMdd-HHmmss")

・FileSystemObjectを使ったフォルダ作成
Dim FSO As Object
FSO = Server.CreateObject("Scripting.FileSystemObject")
If FSO.folderExists("C:\Uploads\" & mFolder) = False Then
FSO.createfolder("C:\Uploads\" & mFolder)
End If
FSO = Nothing
KillComObject(FSO)
 
'COM オブジェクトの使用後、明示的に COM オブジェクトへの参照を解放する
Private Sub KillComObject(ByRef comObj As Object)
Try
'提供されたランタイム呼び出し可能ラッパーの参照カウントをデクリメントします
If Not comObj Is Nothing AndAlso System.Runtime.InteropServices. _
Marshal.IsComObject(comObj) Then
Dim cnt As Integer
Do
'COM オブジェクトが確実に解放されるようにするには、
'ループを作成し、返される参照カウントが 0 になるまで実行
cnt = System.Runtime.InteropServices.Marshal.ReleaseComObject(comObj)
Loop Until cnt <= 0
End If
Catch
Finally
'参照を解除する
comObj = Nothing
End Try
End Sub


・System.IOを使ったフォルダ作成
Dim target As DirectoryInfo = New DirectoryInfo("C:\Uploads\" & mFolder)
If target.Exists = False Then
target.Create()
End If

サンプルはこちら→UploadTest.lzh

注:サンプルはIISでアップロード専用フォルダを仮想ディレクトリとして設定している。これは、Webアプリケーションのコンテンツフォルダとは別ドライブに配置した場合を想定したもの。

サンプル動作画面

1.起動画面
起動画面

2.FileSystemObjectを使ったフォルダ作成によるアップロードFileSystemObjectによるフォルダ作成

3.System.IOを使ったフォルダ作成によるアップロードSystem.IOによるフォルダ作成
posted by なっちゃん at 11:17| 静岡 ☔| Comment(4) | TrackBack(0) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする

2007年05月02日

動的コントロールのサンプル(ASP.NET 2.0)

GridViewは大変便利であるが、表形式の入力画面が欲しいときにはやや力不足なところがある。基本的に行単位でしか編集ができないし、任意のセルに自由に移動し入力することができない。

そこでセル毎に一つ一つコントロールを配置していく方法が求められるのだが、固定した行数とは限らないのでどうしても動的に作成したい。しかし動的コントロールの作成は結構面倒で分からない点多い。いろいろ試行錯誤してようやく何とかものになったノウハウをここで紹介したい。実際の業務で使っている仕組みなので参考になると思う。

表(コンテナ)は「Table Web コントロール」を使っている。
これはそもそも動的コントロール用に用意されたと言っても良い代物で、固定の表に使うにはどう考えても無駄でしかない。

サンプルはダウンロードして使えます。→ DynamicTableCreate.lzh
DynamicTableCreate2.lzh (2007.05.18更新)
「ETextBox+Buttonを作成」を追加しました。


動作画面は下図を。

@起動直後の画面:まだコントロールは一つも無い
起動直後

Aテキストを表に出力
テキストを出力

BHyperLinkコントロールを作成
リンクを作成

CTextBoxコントロールを作成
テキストボックスを作成

DButtonコントロールを作成、下はボタンをクリックしたもの
Buttonを作成

クリックイベントを起こしたところ

追加補足
posted by なっちゃん at 19:32| 静岡 ☀| Comment(16) | TrackBack(1) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする

GridViewのテンプレートにつけたボタンをクリックしたときの行位置を取得するには

GridViewである行を選択すると標準の「選択」ボタンであれば、SelectedIndexChangedイベント内でSelectedRowとして選択行のオブジェクトを取得できる。(下コード)

Dim row As GridViewRow = GridView1.SelectedRow

だが、TemplateFieldとしてイメージボタン等を配置した場合、このボタンをクリックしてもSelectedRowは取得できない。
その場合どうするか。MicrosoftのヘルプにはRowCommandイベントを使って取得する例が載っている。(下リンク)
http://msdn2.microsoft.com/ja-jp/library/system.web.ui.webcontrols.gridview.rowcommand(VS.80).aspx

が、注意すべきはこのイベントだけの手続きでは取得できないことだ。

その下に記載されているRowCreatedイベントとセットになっていることを当初全く考えもしなかったため、いくらやっても取得できず、最後には「ヘルプが間違っている」とまで思っていたのだ(^^;
説明の仕方にも問題があるとは言えないだろうか?

Microsoftのヘルプのサンプルコード(補足)
 
Sub CustomersGridView_RowCreated(ByVal sender As Object, _
ByVal e As GridViewRowEventArgs)
If e.Row.RowType = DataControlRowType.DataRow Then
Dim addButton As LinkButton = CType(e.Row.Cells(0).Controls(0), LinkButton)
'ここで行番号をセットしておく
addButton.CommandArgument = e.Row.RowIndex.ToString()
End If
End Sub
 
Sub CustomersGridView_RowCommand(ByVal sender As Object, _
ByVal e As GridViewCommandEventArgs)
If e.CommandName = "Add" Then
'セットしておいた行番号を取得
Dim index As Integer = Convert.ToInt32(e.CommandArgument)
Dim row As GridViewRow = CustomersGridView.Rows(index)
Dim item As New ListItem()
item.Text = Server.HtmlDecode(row.Cells(2).Text)
If Not CustomersListBox.Items.Contains(item) Then
CustomersListBox.Items.Add(item)
End If
End If
End Sub

posted by なっちゃん at 17:19| 静岡 ☀| Comment(1) | TrackBack(0) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする

2007年04月26日

ASP.NET Ajax を導入後、既存のWebアプリをAjax対応にする場合の注意

Web.Configに以下の箇所を追加しないと、エラー「'Sys'は宣言されていません」が出る。

1.configSections セクション丸ごと
2.system.web セクション内
 ・pages内のcontrols
 ・httpHandlers
 ・httpModules
3.system.webServer セクション丸ごと

実際の内容は、新規プロジェクトでASP.NET AJAX-Enabled Web Applicationを作成した時のWeb.Configを参照するとよい。

posted by なっちゃん at 11:11| 静岡 ☔| Comment(0) | TrackBack(0) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする

2007年04月25日

些細なことだけど、操作性が良くなる設定

ASP.NET2.0の開発をするとき、VS2005の初期設定ではちょっと煩わしい操作上の問題がある。

それは、ソース(フォーム)にコードを貼り付けをしようとしてマウスでその箇所をクリックすると、タグが強調表示されて文字列が右方向にズレてしまう。そのため右クリックしてメニューを表示するタイミングで貼り付け位置が当初の予定より左にズレでしまい、変なところにコードが貼り付いてしまうのだ。最初のクリックを省いて右クリックだけ行えば良いのだが、癖でついクリックしてしまうので厄介なのである。

1.タグが強調表示されて・・・
タグが強調表示されて・・・

2.貼り付けたコードがズレた!
貼り付けたコードがズレた!

タグの強調表示はあまりメリットが無いので、この機能を止めてしまうにはどうすれば良いのか探してみたところ下図のところのチェックを外せば良いことが分かった。

3.「区切り記号を自動強調表示する」を解除
強調表示を解除
posted by なっちゃん at 10:35| 静岡 ☔| Comment(0) | TrackBack(0) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする

2007年03月20日

ASP.NET 2.0 で動的にコントロールを作成する方法

Microsoftのサポートオンラインには「Visual Basic .NET を使用して ASP.NET で動的にコントロールを作成する方法」というサンプルがある。これはASP.NETの1.0/1.1のためのものであるが、2.0ではどうしたらいいのかと思って試しにやってみたところ、ほとんど利用可能であることがわかった。2.0で動かすには、余分に追加するのではなく、不要な箇所を除くだけである。

オリジナルはMicrosoftのサイトを見てもらうとして、ASP.NET2.0のソースを用意したので必要な方はご覧ください。

ダウンロード→Default.lzh


その後、「ASP.NET Webページにコントロールをプログラムによって追加する」というページを見つけた。さらに、「Table Web サーバー コントロールに行およびセルを動的に追加する」もあった。
いずれもASP.NET2.0のサンプルなので、こちらの方がより参考になると思う。
posted by なっちゃん at 10:32| 静岡 ☁| Comment(0) | TrackBack(0) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする

2007年02月28日

ASP.NET2.0+AJAXは使える!

Ajaxについては以前から興味があったが、なかなか使う機会がなかった。
先月Microsoftが「ASP.NET 2.0 AJAX Extensions 1.0」を公開してようやく実際に仕事(業務)で使える状態になった。

サンプルを動かしてみてその使い勝手の良さに感心した。これからのASP.NETでは必須のツールになることは間違いないだろう。
WebアプリにWindowsアプリ(リッチクライアント)の操作性を提供するのだから、一度でも使ったら元に戻る気には到底なれないと思う。しかもこれはフレームワークでの提供なので誰でも簡単に使える。まだ詳細に使ってみた訳ではないので本当の使い勝手は未知数だが試してみる価値は大いにあろう。

ASP.NET AJAXを勉強するなら山田祥寛氏とWINGSプロジェクトのものがいい。
1.「マイクロソフトのAjax対応フレームワーク「Atlas」入門」
※AtlasというのはASP.NET 2.0 AJAX Extensionsの開発コード名
http://itpro.nikkeibp.co.jp/article/COLUMN/20061110/253333/
2.「触ってみようASP.NET 2.0 AJAX Extensions 」
http://codezine.jp/a/article/aid/799.aspx

山田氏のAjax入門書はASP.NET以外にJava,PHPも解説している。

サーバサイドAjax入門 Java/PHP/ASP.NET連携でAjaxプログラミングを極める!
サーバサイドAjax入門 Java/PHP/ASP.NET連携でAjaxプログラミングを極める!
山田 祥寛

関連商品
Ajaxハッカーズ・プログラミング―基礎からprototype.js、Yahoo!UIライブラリ、HTML_AJAXの活用までWebアプリケーション制作のプログラミング・テクニック
Ajaxイン・アクション
Ajax 実装のための基礎テクニック
実例で学ぶ! [入門と実践] Ajax+XML [CD-ROM付き]
AJAX Webアプリケーション アイデアブック
by G-Tools


posted by なっちゃん at 19:44| 静岡 ☀| Comment(0) | TrackBack(1) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする

2006年11月30日

ASP.NET 2.0 のベスト参考書

VisualStudio2005によるASP.NET 2.0での開発が始まった。
そこで、手っ取り早くASP.NET(1.1)との違いを知り、新しく追加されたコントロールを覚えるために使った参考書が山田祥寛氏の著作「10日でおぼえるASP.NET2.0入門教室」である。
山田氏の著作は、その判り易さとサンプルの実用性の高さでこれまでにもJava開発で大いに活用させてもらった。今回の本もその有用性は抜群である。(入門編とあなどる無かれ、ASP.NET2.0の技術仕様を解説でしっかり説明している。ここが他の類似参考書と一線を画す山田氏の著書の優れたところだ)
ファイルアップロードのサンプルは実際の開発で必要なものだったし、マスターページとコンテンツページの使い方、メニューの活用からデータベースの扱いまでほとんど全てが使える代物で、大助かりこの上ない!さすがMicrosoft ASP.NET MVPである。

なお、実際にこの本で学習するときにはサンプルコードをWebサイトからダウンロードしてからだが、サンプルがHTMLとプログラムが一体となった「コードインライン」モデルで既に作成済みなので、学習用には「コードビハインド」モデルを使って別名で新規作成しながら行うといいと思う。サンプルがHello.aspxであれば、Hello2.aspxとして作るといった具合である。実際の開発現場ではコードインラインモデルで作ることはまずありえないので。

10日でおぼえるASP.NET 2.0 入門教室
10日でおぼえるASP.NET 2.0 入門教室山田 祥寛

翔泳社 2006-08-03
売り上げランキング : 3666

Amazonで詳しく見る
by G-Tools

関連商品
Pocket詳解 ASP.NET辞典
プロが作った!すぐに使える! ASP.NET 2.0 実践サンプル集
Microsoft Visual Studio 2005によるWebアプリケーション構築技法
プログラミング Microsoft ASP.NET 2.0
ひと目でわかるMicrosoft SQL Server 2005

posted by なっちゃん at 09:52| 静岡 ☁| Comment(0) | TrackBack(0) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする

2006年08月03日

ASP.NETでJavascriptを外部ファイルにする場合の注意

前回のTipsでjavascriptを扱ったが、これをASP.NETに実装する際、変更が楽なように外部ファイルにしてテストしたところ何故かエラーになった。下図

エラーメッセージ
ランタイムエラーが発生しました。
デバッグしますか?
行:23
エラー:文字が正しくありません。

どうやら日本語のメッセージが原因のようで、文字を変えてみたりするとエラーにならなかったりするのだが、不思議なのは外部ファイルにせず直接ASPXファイルに記述するとそのままでも問題なく動いたことである。となると、外部ファイルの読込み時になにか問題があるようなので、いろいろ調べてみた。そしてファイルの文字コードがShift-JISであることが原因らしいと判った。ASPX自体もShift-JISなのに何でかと思うのだが、ある掲示板に「ASP.NETによるサーバ出力の文字コード体系はUTF-8」と書いてあった。
Web.ConfigにもUTF-8とあるし、以前にも確か同じことで悩んだことも思い出した(^^;

そこで、外部javascriptファイルをUTF-8に変換してみたところ正常に動いた。
(※日本語を使っていなければShift-JISのままでもエラーにはならない)

Shift-JISのファイルをUTF-8に変換するのはメモ帳を使うとよい。
読込み後、「名前を付けて保存」時に文字コードを「ANSI」から「UTF-8」に変更するだけである。(下図)

メモ帳でUTF-8で保存する
posted by なっちゃん at 11:41| 静岡 ☁| Comment(2) | TrackBack(0) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする

2006年08月02日

テキストボックスの入力可能文字数をバイト数で制御するには(Javascript)

データベースを使うアプリケーションではWebアプリにせよWindowsアプリにせよ、テキストボックスに入力した文字列が全て登録されるわけではないことをオペレータ側に伝える必要がある。

その方法として一番判りやすいのは入力中にバイト数を計算して最大値を超えたら警告を出すものだ。
Windowsアプリではそれはプログラム内部で行うので特に問題は無いが、Webアプリではテキストボックス毎にポストバックしてサーバーに処理させていたのではあまりに使い勝手が悪い。クライアント側で制御する必要がある。そこで活躍するのがJavascript。

このサンプルは、テキストボックスの内容をどのタイミング(イベントの発生場所)で判定するかで使い勝手が変わるので、運用状況に合わせて使って欲しい。

関数本体は下の通り。(ソースは画像)
javascript

下の画像をクリックするとサンプルが実行されます。
JavaScriptでテキスト入力のバイト制限

サンプルのinputタグにはmaxlengthの指定は無いが併用するとなお良い。
もとより半角英数しか入力させないのならmaxlengthの指定で十分なのだから。
posted by なっちゃん at 19:43| 静岡 ☁| Comment(2) | TrackBack(0) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする

2006年04月21日

三度つまずく Oracle+ASP.NET

一昨日の「ORA-00923: FROMキーワードが指定の位置にありません」が再発したと同僚が言ってきた。そんなバカな、ちゃんと動いたことを確認したんだと言って確かめてみると・・・ガーン(@ @;エラーする!

どうしちゃったのか。環境変数NLS_LANGの値は間違いない。でもエラーする。一昨日の確認は幻だったのか?リモートで客先のサーバーを操作していたのだが、自分の環境と混同して確認してしまったのか?いやそんなことはない。確かにNLS_LANGを指定してエラーが無いことを確認し、再度NLS_LANGを無効化してエラーになることを確認しているのだ。この環境変数の有無でエラーするかしないかを確認したはずなのだ。
ところが今日調べてみるととNLS_LANGはあってもなくても自分の開発環境(Webサーバー)では問題なく動き、DBサーバー上のNLS_LANGにも関係ない。


PC−1・・・・・自分の開発用PC(VB.NET)
ORA−PC・・・Oracle10g + IIS(ASP.NET)
 
Webアプリ Oracle10g 結果
-----------------------------------------
PC−1 ORA−PC 成功
ORA−PC ORA−PC エラー

同僚の開発環境からやってもエラーがでるので正常に動くのは私の環境だけということになった。

こうなると先日のは誤認だったのかと不安になるが・・・。

いろいろ調べてみたなかで「Oracle逆引き大全550の極意 プログラミング編」の549番目「オブジェクト名に日本語を使うことの是非」にSQL文に日本語を使うときの正しい使い方としてダブルコーテーションで日本語を囲む必要があると書かれていた。

正しくない書き方
select 列1, 列2 from テーブル1;

正しい書き方
select "列1","列2" from "テーブル1";

そこで試しにダブルコーテーションを付けてみた。
ASP.NET上のコード例

Dim sql As String
sql = "select retu1 " & """" & "列1" & """" & ",retu2 " & """"" & "列2" & """" & " from table1"


もともとソース上の文字列はダブルコーテーションで囲むのでダブルコーテーション自体を文字として使うには4個のダブルコーテーションで表現する必要がある。

訂正:ここに書かれているように全て文字列の場合は2個続けて記述すれば&で分断する必要はない。
訂正例:
sql = "select retu1 ""列1"",retu2 ""列2"" from table1"

これで実行したところ無事成功した。うーーん、結果オーライとは言え、やはり先日の確認は一体何だったのだろうと思うのである。そして自分の環境は他と何が違うのか。OSはエラーするのがWindowsServer2003で自分のはWindows2000Serverだが、それが原因だろうか。わからん。


Oracle逆引き大全550の極意 プログラミング編―Oracle 10g/9i/8i(Win/UNIX)対応Oracle逆引き大全550の極意 プログラミング編―Oracle 10g/9i/8i(Win/UNIX)対応
ブリリアントスタッフ

Oracle逆引き大全500の極意 DB管理編―Oracle 10g/9i(Windows/UNIX)対応 Oracle DB PL/SQLプログラミング即効リファレンス―Oracle 8i、9i、10g対応 Oracle関数逆引き大全300の極意 やさしいOracle PL/SQL入門 VB.NETによるOracleアプリケーション開発技法

by G-Tools



posted by なっちゃん at 18:23| 静岡 ☁| Comment(1) | TrackBack(1) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする

2006年04月20日

ブレークポイントで止まらない!?

突然ブレークポイントで止まらなくなってしまった。
エラーの原因を調べるためブレークポイントを指定したのに何故かすり抜けてしまう。他のところでエラーしているのかと思ってあちこちブレークポイントを設定したのに、その全てで止まらないのだ。
環境設定が何らかの拍子で変わっちゃったんだろうか?と思って調べてみたがそれらしきものは見当たらない。Googleで調べてみるとDebugモードがReleaseモードに変わった例が見つかった。そうだ!昨日セットアップパッケージを作るためReleaseモードに変更しておいたのだ。
ツールバー上は「Debug」となっていたが、「ビルド」メニューの「構成マネージャ」にはしっかりReleaseになっていた。これをDebugに変更して無事ブレークポイントで止まるようになった。

20060420.gif

上記はVisual Studio の場合で、Express版などでは「構成マネージャ」が無い。その場合は「ビルド」メニューの「○○○のクリーン」を一度実行すると止まるようになった。
posted by なっちゃん at 19:32| 静岡 ☀| Comment(1) | TrackBack(0) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする

2006年04月19日

再びつまずく Oracle+ASP.NET

またしても同じ過ち(無駄な苦労)をしてしまった。
既に1年半前に経験済みだったが、現象が少し違っていたため直ぐに気が付かなかったのだ。

開発中のOracel10g+ASP.NET(VB.NET2003)によるWebアプリを今日ユーザーのサーバーにインストールして動作を確認してもらうことになっていた。
ところが昨日の準備段階からエラーが起きてしまう。こちらの環境では問題ないのに客先のサーバーで動かすとOracleエラー
「ORA-00923: FROMキーワードが指定の位置にありません。」と出てしまう。
SQL文が間違っているのであれば当然こちらでも起きるはずだ。しかしこちらでは正常に処理されているのである。
最初はエラーの発生している箇所のOracleDataAdapterのバージョンでも違っているのかと思って確認してみたが全く同じだった。
念のためにもう一度Oracle Data Provider for .NETを再インストールしてみたが、やはり同じだった。

どう考えてもシステム上の不具合は見当たらない、もう一度エラーメッセージを考えてやはりSQL構文のエラーと見なされていることから、SQL文が正しく解釈されていないからではないかと思った。すると以前に同じOracle(9i)とASP.NETの組み合わせて文字化けしたことを思い起こし、エラーを起こすSQL文に2バイト文字が使われている(フィールド名の別名に使った)ことでようやく原因が見えてきた。

Oracleの使う環境変数「NLS_LANG」が客先のサーバーでは何も指定していない。つまり初期値のままである。これだ!と判った。

NLS_LANG=JAPANESE_JAPAN.JA16SJISTILDE

上記設定をサーバーに指定して無事解決した!!
やれやれだ(^^#

2日後、これが誤りであることが判明
・・・・2006年4月21日

posted by なっちゃん at 13:47| 静岡 ☔| Comment(0) | TrackBack(0) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする

2006年03月18日

ASP.NETでINIファイルの読み書き

以前、VB6とVB.NETでINIファイルの読み書きを扱ったが、今回ASP.NETでの処理上の注意を記しておく。

コードはVB.NETと全く同じである。
しかし、いざ実行させてみると読み込みは問題ないのだが、書き込みが出来ない。実行時のエラーを返さないので最初原因が判らなかった。
Win32APIのWritePrivateProfileString関数がエラーを返しているのか、サンプルコードでは不問にしてあったので下記のように修正してみた。

'エラーコードを取得するAPI
Declare Function GetLastError _
Lib "KERNEL32.DLL" () As Integer

 
Public Sub PutIni(ByVal ApName As String, _
ByVal KeyName As String, _
ByVal Param As String, _
ByVal Filename As String) As Boolean
'INIファイルに新たなキーの値を書込む
' ※既存のキーがあれば更新・なければ新規作成する
'ApName : セクション名
'KeyName : 項目名
'Param : 更新する値
'FileName : 書出ファイル名
'****************************************
Dim DllErrCode As Integer
Dim lngResult As Integer
lngResult = WritePrivateProfileString( _
ApName, KeyName, Param, Filename)
'-- 成功すると0以外の値が返る --
If lngResult = 0 Then
DllErrCode = GetLastError()

Debug.WriteLine(DllErrCode.ToString)
End If
End Sub

こうして確認したところ エラーコードに5が返ってきた。
これはエラーコード一覧で確認すると「アクセスが拒否された」ことを示している。これで原因が判明した。
ASP.NETはユーザー「ASPNET」としてリソースにアクセスする。INIファイルのプロパティのセキュリティを確認したらASPNETに書込アクセス権が無かった。これを追加したところ無事書き込みできるようになった。
posted by なっちゃん at 17:37| 静岡 ☁| Comment(0) | TrackBack(0) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。