携帯用リンク
メニュージャンプ 携帯専用ページ
2012-05-04
いい加減にバージョンあげないと
長らく放置状態だったが、気がつくとNucleus のバージョンが遥か先に行ってしまってる。
そろそろバージョンあげよう。
最近、弄っているものは Cacti とか、Rとか、ESXIとか。
半年ぐらい前にサーバーを 440BXのBH6マシーンから NEC安鯖に変えたり、いろいろやっている。
そろそろバージョンあげよう。
最近、弄っているものは Cacti とか、Rとか、ESXIとか。
半年ぐらい前にサーバーを 440BXのBH6マシーンから NEC安鯖に変えたり、いろいろやっている。
2009-07-17
ストアドプロシージャの戻り値取得方法(.Net2.0 SqlDataSource)
Visual Studio 2005 で SqlDataSource を使ってストアドプロシージャを実行したときに戻り値がある場合の取得方法を調べたメモ。
InsertQueryにストアドプロシージャを設定して普通に Output用パラメータを画面上の項目とかにバインドしても全然反映しないのでいろいろと調べてみた結果、
Insertedイベントのパラメータで渡される SqlDataSourceStatusEventArgs e で取得できるらしいということが判った。
と言うことで、実験した。
Inserted イベント用のメソッドで止まるようにブレイクポイント指定して、変数 e の内容を調べた結果
イミディエイトウィンドウにて
? e.Command.Parameters["@RES_STR"]
とかやると、結果は...
{@RES_STR}
[FirebirdSql.Data.FirebirdClient.FbParameter]: {@RES_STR}
base {System.MarshalByRefObject}: {@RES_STR}
DbType: String
Direction: Output
IsNullable: false
ParameterName: "@RES_STR"
Size: 0
SourceColumn: ""
SourceColumnNullMapping: false
SourceVersion: Current
Value: "a:b"
と言うことは、
? e.Command.Parameters["@RES_STR"].Value
"a:b" (これが実際に返される値で間違いなし)
つまり、Insertedイベントのメソッド内で
e.Command.Parameters[出力用パラメータ].Value
で、取得できる。
ということが確認できました。
ちなみに実際には行を挿入しつつ、その行のプライマリキーを返すストアドプロシージャとかのときに使います。
InsertQueryにストアドプロシージャを設定して普通に Output用パラメータを画面上の項目とかにバインドしても全然反映しないのでいろいろと調べてみた結果、
Insertedイベントのパラメータで渡される SqlDataSourceStatusEventArgs e で取得できるらしいということが判った。
と言うことで、実験した。
- - - - - - - - -
実験用のストアドプロシージャ:PROC_TEST
Procedure text:
==================================================
DECLARE VARIABLE strInnerTXT VARCHAR(20);
BEGIN
RES_STR = CUST_NM || ':' || CUST_NM_KN;
END
==================================================
Parameters:
CUST_NM INPUT VARCHAR(40)
CUST_NM_KN INPUT VARCHAR(60)
RES_STR OUTPUT VARCHAR(20)
- - - - - - - - -
Inserted イベント用のメソッドで止まるようにブレイクポイント指定して、変数 e の内容を調べた結果
イミディエイトウィンドウにて
? e.Command.Parameters["@RES_STR"]
とかやると、結果は...
{@RES_STR}
[FirebirdSql.Data.FirebirdClient.FbParameter]: {@RES_STR}
base {System.MarshalByRefObject}: {@RES_STR}
DbType: String
Direction: Output
IsNullable: false
ParameterName: "@RES_STR"
Size: 0
SourceColumn: ""
SourceColumnNullMapping: false
SourceVersion: Current
Value: "a:b"
と言うことは、
? e.Command.Parameters["@RES_STR"].Value
"a:b" (これが実際に返される値で間違いなし)
つまり、Insertedイベントのメソッド内で
e.Command.Parameters[出力用パラメータ].Value
で、取得できる。
ということが確認できました。
ちなみに実際には行を挿入しつつ、その行のプライマリキーを返すストアドプロシージャとかのときに使います。
VS2005+SDK で FirebirdClient-2.1.0 + DDEX
Visual Studio 2005 Pro (以後VS) で Firebird を使うには
「Firebird ADO.NET Data Provider」を使う訳ですが、それに加えて
「DDEX Provider for Visual Studio」と組み合わせるとVSのIDE上で便利に使えるようになる。(ある程度)
最初は
FirebirdClient-2.0.1 + FirebirdDEXProvider-2.0.2
の組み合わせで何とか使っていた。
(クエリパラメータに「@XXXX」ではなく 「?」を使うことでわりと安定して使えた。@+名前が使えなかったのは多分withSDKになってなかったからかも)
が、ストアドプロシージャのパラメータ受け渡しに関連してどうもうまくいかないので最新版(といってもほんの数日で次のバージョンが出てしまった...)に切り替えてみることにした。
その時点での最新版は FirebirdClient-2.1.0 と FirebirdDDEXProvider-2.0.4 の組み合わせ。
付属の ReadMe.txt とか Web上の情報を参考に
FirebirdClient-2.1.0 + FirebirdDDEXProvider-2.0.4
を入れてみた。(この部分もいろいろあって、machine.configのバージョン書き換えとかレジストリの削除とか)
で、なんとかセットアップ完了!
ところが、これまでコンパイルが通っていた既存のプログラムが全部エラーでビルドができない状態になってしまった。
いろいろ調べてみて、VSのツールメニューにある「package load analyzer」でmscoree.dllが見つからない旨のエラーが発生することが判った。
関連するレジストリを探してみるとレジストリパス
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\8.0\Packages\{8d9358ba-ccc9-4169-9fd6-a52b8aee2d50}]
"InprocServer32"="mscoree.dll"
となっていた。
これを、実際にファイルがある場所にフルパスで、
"InprocServer32"="c:\\windows\\system32\\mscoree.dll"
と、書き換えてみたら...
ビルドできるようになりました!
めでたしめでたし。
ただ、どちらにしても SQL文のパラメータ受け渡しはちょっとアヤシイ気がする。
参考になるWeb上の情報
[Firebird-jp-general] DDEXProviderの登録に関して
のレスポンスが参考になります。
ちなみに Firebird Client の最新版はこの数日後に 2.5.0 がでました。
そのうち試してみよう。
「Firebird ADO.NET Data Provider」を使う訳ですが、それに加えて
「DDEX Provider for Visual Studio」と組み合わせるとVSのIDE上で便利に使えるようになる。(ある程度)
最初は
FirebirdClient-2.0.1 + FirebirdDEXProvider-2.0.2
の組み合わせで何とか使っていた。
(クエリパラメータに「@XXXX」ではなく 「?」を使うことでわりと安定して使えた。@+名前が使えなかったのは多分withSDKになってなかったからかも)
が、ストアドプロシージャのパラメータ受け渡しに関連してどうもうまくいかないので最新版(といってもほんの数日で次のバージョンが出てしまった...)に切り替えてみることにした。
その時点での最新版は FirebirdClient-2.1.0 と FirebirdDDEXProvider-2.0.4 の組み合わせ。
付属の ReadMe.txt とか Web上の情報を参考に
FirebirdClient-2.1.0 + FirebirdDDEXProvider-2.0.4
を入れてみた。(この部分もいろいろあって、machine.configのバージョン書き換えとかレジストリの削除とか)
で、なんとかセットアップ完了!
ところが、これまでコンパイルが通っていた既存のプログラムが全部エラーでビルドができない状態になってしまった。
いろいろ調べてみて、VSのツールメニューにある「package load analyzer」でmscoree.dllが見つからない旨のエラーが発生することが判った。
関連するレジストリを探してみるとレジストリパス
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\8.0\Packages\{8d9358ba-ccc9-4169-9fd6-a52b8aee2d50}]
"InprocServer32"="mscoree.dll"
となっていた。
これを、実際にファイルがある場所にフルパスで、
"InprocServer32"="c:\\windows\\system32\\mscoree.dll"
と、書き換えてみたら...
ビルドできるようになりました!
めでたしめでたし。
ただ、どちらにしても SQL文のパラメータ受け渡しはちょっとアヤシイ気がする。
参考になるWeb上の情報
[Firebird-jp-general] DDEXProviderの登録に関して
のレスポンスが参考になります。
ちなみに Firebird Client の最新版はこの数日後に 2.5.0 がでました。
そのうち試してみよう。
インサート文一発で複数レコードの連番もうまく作ってくれた
FirebirdのSQLで最近いいと思ったこと。
テーブルAの内容をテーブルBに一括コピーする場合で、新しく別の連番をカウントアップさせて採番したい場合にInsert文一発でできるということ。
例えば顧客マスタと顧客履歴テーブルがあったとして、
顧客マスタ:cust_mast
カラムが
cust_id int
cust_name varchar(20)
cust_rank integer
顧客履歴テーブル:cust_hist
カラムが
cust_hist_no integer (PK)
cust_id integer
cust_name varchar(20)
cust_rank integer
初期データで顧客マスタは1000件ぐらいあって顧客履歴はまだ0件だけど、運用開始時には
初期データが作成されたときの顧客履歴を用意しておきたいという場合。
以下のようなInsert文一発でできて嬉しかった。
INSERT INTO cust_hist (
cust_hist_no,
cust_id,
cust_name,
cust_rank
) SELECT
(SELECT CASE WHEN (MAX(cust_hist_no) IS NULL) THEN 0 ELSE MAX(cust_hist_no) END FROM cust_hist) + 1 ,
cust_mast.cust_id,
cust_mast.cust_name,
cust_mast.cust_rank
FROM cust_mast
ORDER BY cust_mast.cust_id ;
感覚的には複数行を一括で処理するとキー違反になりそうですがなぜか意図したとおりに1行ずつカウントアップした値を cust_hist_no に入れてくれた。
普通に考えると「カーソル使ってループでまわして一行ずつ処理するプロシージャを作らないとなー...メンドクサイ...」などと思ってたらINSERT文一発でできてラッキー!って感じ。
※
MySqlのオートインクリメントとか MS-Sql の Identity のようなそのものズバリの機能はFirebirdにはない。
(Firebirdではシーケンスというものを作ってgen_id関数で呼び出すことで連番の次の値を作る)
まあ、連番自動生成機能を使ってない(使いたくない)カラムでの話です。
テーブルAの内容をテーブルBに一括コピーする場合で、新しく別の連番をカウントアップさせて採番したい場合にInsert文一発でできるということ。
例えば顧客マスタと顧客履歴テーブルがあったとして、
顧客マスタ:cust_mast
カラムが
cust_id int
cust_name varchar(20)
cust_rank integer
顧客履歴テーブル:cust_hist
カラムが
cust_hist_no integer (PK)
cust_id integer
cust_name varchar(20)
cust_rank integer
初期データで顧客マスタは1000件ぐらいあって顧客履歴はまだ0件だけど、運用開始時には
初期データが作成されたときの顧客履歴を用意しておきたいという場合。
以下のようなInsert文一発でできて嬉しかった。
INSERT INTO cust_hist (
cust_hist_no,
cust_id,
cust_name,
cust_rank
) SELECT
(SELECT CASE WHEN (MAX(cust_hist_no) IS NULL) THEN 0 ELSE MAX(cust_hist_no) END FROM cust_hist) + 1 ,
cust_mast.cust_id,
cust_mast.cust_name,
cust_mast.cust_rank
FROM cust_mast
ORDER BY cust_mast.cust_id ;
感覚的には複数行を一括で処理するとキー違反になりそうですがなぜか意図したとおりに1行ずつカウントアップした値を cust_hist_no に入れてくれた。
普通に考えると「カーソル使ってループでまわして一行ずつ処理するプロシージャを作らないとなー...メンドクサイ...」などと思ってたらINSERT文一発でできてラッキー!って感じ。
※
MySqlのオートインクリメントとか MS-Sql の Identity のようなそのものズバリの機能はFirebirdにはない。
(Firebirdではシーケンスというものを作ってgen_id関数で呼び出すことで連番の次の値を作る)
まあ、連番自動生成機能を使ってない(使いたくない)カラムでの話です。
2008-08-09
Tomcatのバージョンアップでハマッた
開発環境用の Tomcatを新しいバージョンにしたらはまった。
結論は Windows環境用 apache-tomcat-6.0.18.exe 入れたら conf/tomcat-users.xml の文字エンコードが cp932 になっているので気をつけよう。
ということなのですが。。。以下、その顛末。
なぜ、アップグレードしようと思ったかと言うと運用サーバーが死にかけたときにOS含めて新しい環境作ったけど開発環境は古いままで寂しかったから。
バージョンは 5.5系から 6.0系へ
(プラットホームはWindows XP)
まず、JDKを 1.5系から 6の最新版 (1.6.0_07) に変更(既存をアンインストールして新規セットアップ)
Tomcat5.5 の lib内に手動で追加したjarファイルと webapps 以下とかを退避用のフォルダにコピー後に uninstall実施。
その後で Tomcat5.5が入っていたフォルダを完全消去。
最新版の Tomcat6.0.18のインストーラ「apache-tomcat-6.0.18.exe」ダウンロード後、実行。
完了後、一応環境変数 CATALINA_HOMEを新しいPathに書き換えて
「Monitor Tomcat」で一旦ストップさせてもう一回スタート。
ブラウザで localhost:8080 にアクセスすると。。。
あれれ?
いつものデフォルトページが表示されないのでログを見ると
「java.io.UnsupportedEncodingException: cp932」
とか
「javax.naming.NamingException: cp932」
が出てて起動できなかったような内容のスタックトレース。
なんで cp932?と思いながら googleで検索するとタイムリーなページ発見。
gnarlさんの「gnarl、技術メモ」
Tomcat,UnsupportedEncodingExceptionとかで起動しない
が、、、
解決法は
「tomcatのconfディレクトリ内、encoding="cp932"になってるxmlがあったらutf-8に修正」
だけどそんな記述は見つけられなかった。
ただ、コメントで
「つい最近のリリースで発生した不具合なんですかね。」
という部分を見てじゃあ一つ前のバージョンで試してみようと思って
6.0.16を入れてみたら問題なく起動できた。
でも気になったのでもう一度別の環境に 6.0.18を入れてみたら。。。
ありました!cp932の記述!
conf/tomcat-users.xml
と言うことで、6.0.16 に入れなおしたやつをもう一回 6.0.18 に入れなおしました。
何で見落としたのか。。。 orz
結論は Windows環境用 apache-tomcat-6.0.18.exe 入れたら conf/tomcat-users.xml の文字エンコードが cp932 になっているので気をつけよう。
ということなのですが。。。以下、その顛末。
なぜ、アップグレードしようと思ったかと言うと運用サーバーが死にかけたときにOS含めて新しい環境作ったけど開発環境は古いままで寂しかったから。
バージョンは 5.5系から 6.0系へ
(プラットホームはWindows XP)
まず、JDKを 1.5系から 6の最新版 (1.6.0_07) に変更(既存をアンインストールして新規セットアップ)
Tomcat5.5 の lib内に手動で追加したjarファイルと webapps 以下とかを退避用のフォルダにコピー後に uninstall実施。
その後で Tomcat5.5が入っていたフォルダを完全消去。
最新版の Tomcat6.0.18のインストーラ「apache-tomcat-6.0.18.exe」ダウンロード後、実行。
完了後、一応環境変数 CATALINA_HOMEを新しいPathに書き換えて
「Monitor Tomcat」で一旦ストップさせてもう一回スタート。
ブラウザで localhost:8080 にアクセスすると。。。
あれれ?
いつものデフォルトページが表示されないのでログを見ると
「java.io.UnsupportedEncodingException: cp932」
とか
「javax.naming.NamingException: cp932」
が出てて起動できなかったような内容のスタックトレース。
なんで cp932?と思いながら googleで検索するとタイムリーなページ発見。
gnarlさんの「gnarl、技術メモ」
Tomcat,UnsupportedEncodingExceptionとかで起動しない
が、、、
解決法は
「tomcatのconfディレクトリ内、encoding="cp932"になってるxmlがあったらutf-8に修正」
だけどそんな記述は見つけられなかった。
ただ、コメントで
「つい最近のリリースで発生した不具合なんですかね。」
という部分を見てじゃあ一つ前のバージョンで試してみようと思って
6.0.16を入れてみたら問題なく起動できた。
でも気になったのでもう一度別の環境に 6.0.18を入れてみたら。。。
ありました!cp932の記述!
conf/tomcat-users.xml
と言うことで、6.0.16 に入れなおしたやつをもう一回 6.0.18 に入れなおしました。
何で見落としたのか。。。 orz
kagekino
90. 未整理
2012-05-04 14:10

