携帯用リンク
メニュージャンプ  携帯専用ページ
«Prev || 1 | 2 | 3 || Next»

2009-07-17

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 がでました。
そのうち試してみよう。

category11. RDB Firebird  time2009-07-17 17:59

2009-07-17

インサート文一発で複数レコードの連番もうまく作ってくれた

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関数で呼び出すことで連番の次の値を作る)
まあ、連番自動生成機能を使ってない(使いたくない)カラムでの話です。
category11. RDB Firebird  time2009-07-17 14:46

2007-06-03

Firebird ホスト名変えると...

Debian sarge から CentOS-5.0 への環境移行は使いたいハードウェアの事情で CentOS-4.4 にした。

移行そのものの詳細は別記事をそのうち書こうと思うが、今回はその移行の過程で Firebird 関連でちょっとはまった罠について書きます。

移行の手順は
(1)
新しいマシンに CentOS-4.4 をインストール
このとき、ホスト名は「nyahaha2」に設定。
※運用中の移行元ホスト名は「nyahaha」で
(2)
「nyahaha2」に Firebird をセットアップ。
(手順は CentOS-5.0 と全く同じ手順でいけた)
(3)
「nyahaha2」と「nyahaha」は同じネットワーク上でクライアントから個別にホスト名を指定して動作テストとかを行う。(データは「nyahaha」でバックアップしたデータをリストアした)
(4)
一通りのテストはクリア。
(5)
「nyahaha」で各種最新のデータベースバックアップデータを作成。
(6)
「nyahaha」のホスト名を「nyahaha_old」に変更し、IPアドレスを空きのものに変更。
(7)
「nyahaha2」のホスト名とIPアドレスを(6)で変更する前の「nyahaha」と同じものに変更。
※これで「nyahaha」は新しくセットアップした CentOS-4.4 の環境になった。
(8)
旧「nyahaha」で作ったデータベースバックアップを新「nyahaha」にリストアする。
...と、ここでリストアできない! create database も gsec コマンドもエラー!!
??あれれ!?
 ?詳しいエラーメッセージ等は後で追記予定?

と、はまってしまいましたが以下の手順で一応解決。
結論から書くと、Firebirdディレクトリにある以下のファイルにホスト名が使われています。
isc_event1.nyahaha2
isc_guard1.nyahaha2
isc_init1.nyahaha2
isc_lock1.nyahaha2

で、これらは Firebird を停止&起動しても変更される訳でもなく新しいホスト名のものが追加される訳でもないようです。
今回はこれらのファイル名を以下のように変更しました。
mv isc_event1.nyahaha2 isc_event1.nyahaha
mv isc_guard1.nyahaha2 isc_guard1.nyahaha
mv isc_init1.nyahaha2 isc_init1.nyahaha
mv isc_lock1.nyahaha2 isc_lock1.nyahaha

※変更するときは Firebird は停止させてます。

この方法が正しい手順かどうかは全く判りません。というかホスト名を変えるときの正式な手順はどうやるんだろう??
あと、複数のホスト名を持たせるサーバとかの場合とか...

とにかく、リストアも出来てユーザの追加も出来てクライアントからのアクセスも問題無かったので一応解決としておこう。



他にも書いておきたいネタが多数たまっている。
・Thinkpad昇天から中古購入とHDD内容移行
・CentOS-4.4 で SiI3132 を使う
・EUCで動かしてた samba データを utf8 環境に移行させる
・MySQL用にSQL文をFirebirdで動かす場合の変更点
・AX300LのHDD&DVD-R交換(UJ-846-B)
category11. RDB Firebird  time2007-06-03 03:25

2007-04-21

Firebird の最新情報は Firebird News で!

なぜかFirebirdのセットアップ手順的な記事を書くと「Firebird News」というかなりメジャーっぽいサイトで紹介されてしまいます。

今回の「CentOS-5.0 に Firebird 2.0.1 をセットアップしてみた手順」は
Setting up Firebird 2.0.1 in CentOS-5.0

昨年10月のエントリ「Firebirdかなりいい加減なアップグレード手順(1)」は
Firebird random upgrade procedure between release canditates
という感じ。
2chの Firebird Wiki を「They have an link to a good firebird japanese wiki site」なんてコメントくれてますね。

しかもご丁寧にGoogle翻訳へのリンク付きです。

とにかく紹介してくれてありがとう Firebird News さん。
category11. RDB Firebird  time2007-04-21 11:10

2007-04-19

CentOS-5.0 に Firebird 2.0.1 をセットアップしてみた手順

4月12日に CentOSの5.0がリリースされました。
これを機会に今運用している Sarge と FC3 のサーバをこの CentOS-5.0 に切り替えてみようと企んでいる。
ついでに Firebird も 2.0.1 で動かしてみようと試してみた手順を残しておこう。

まずは、
FirebirdSS-2.0.1.12855-0.nptl.i686.rpm
を適当な場所にダウンロードして

# rpm -ivh FirebirdSS-2.0.1.12855-0.nptl.i686.rpm
エラー: 依存性の欠如:
libstdc++.so.5 は FirebirdSS-2.0.1.12855-0.i686 に必要とされています

はい、失敗。。。「libstdc++.so.5」が必要ということなので以前の手順に記述した FC3 の場合の対応をそのまま試してみた。

# yum install compat-libstdc++
Loading "installonlyn" plugin
Setting up Install Process
Setting up repositories
base 100% |=========================| 1.1 kB 00:00
updates 100% |=========================| 951 B 00:00
addons 100% |=========================| 951 B 00:00
extras 100% |=========================| 1.1 kB 00:00
Reading repository metadata in from local files
Parsing package install arguments
Nothing to do

あれれ?失敗?
Webで検索して調べてみると「libstdc++.so.5」を CentOS に入れるには

# yum install compat-libstdc++-33

となるらしい。が。。。
なんかリポジトリ上には見つからないらしい。
で、DVDを見てみると、しっかりファイルは存在していたので
rpmコマンドで以下を実行

# rpm -ivh /media/cdrom/CentOS/compat-libstdc++-33-3.2.3-61.i386.rpm

これで「libstdc++.so.5」がめでたく入りました。

(追記 2007/04/20 begin)
※ここは yum をDVDをリポジトリでやったほうが良さそうです。
# yum --disablerepo=\* --enablerepo=c5-media install compat-libstdc++-33

詳しくはこちらに記述。
(追記 2007/04/20 end)

再度 Firebird のセットアップ挑戦
# rpm -ivh FirebirdSS-2.0.1.12855-0.nptl.i686.rpm

今度は成功

rpmでセットアップした場合は sysdba のパスワードは
/opt/firebird/SYSDBA.password
に記述されている。
このパスワードを変更するには、
/opt/firebird/bin/changeDBAPassword.sh
を使うのが良いらしい。
他のアカウントは通常通り gsec を使うということでよいのかな。

あと、
/etc/profile に以下を追加してパスを通しておくようにする。

export PATH=$PATH:/opt/firebird/bin

ついでに、コマンドラインからも実行しておく。

とりあえずデータベースを新規作成してみる。
ここでは root から通常ユーザ(ここでは「nahaha」)にもどして、
自分のホームにディレクトリ「fb」を作ってそこをカレントにして
$ isql -user sysdba -password xxxxxx
SQL> CREATE DATABASE 'nyahaha_db.fdb' page_size 8192 DEFAULT CHARACTER SET SJIS_0208 ;
Statement failed, SQLCODE = -902
I/O error for file "/home/nahaha/fb/nyahaha_db.fdb"
-Error while trying to create file
-Permission denied

またまた、あれれ??
で、いろいろ調べてみると firebird は firebird ユーザで実行されているらしいから firebird が所有者のディレクトリならばいけそうな気がする。
ということで、
/home/nahaha/fb
の所有者とグループを「firebird」に変更してみる。
rootになって
# chown firebird /home/nahaha/fb
# chgrp firebird /home/nahaha/fb

もう一度 nahaha ユーザに戻って isql して CREATE DATABASE するも、同じエラー。

今度は /home に 「fb」ディレクトリを作って所有者とグループを「firebird」にしてみる。
つまり
/home/fb
の所有者とグループが「firebird」にして再度挑戦!

$ isql -user sysdba -password xxxxxx
SQL> CREATE DATABASE '/home/fb/nyahaha_db.fdb' page_size 8192 DEFAULT CHARACTER SET SJIS_0208 ;

今度は成功。
「firebird」ユーザから見て他人の領域内にあるディレクトリにはたとえ所有者が「firebird」であってもそこにはデータベースを作成できないようだ。

※ちなみにこの CentOS-5.0 環境は Virtual-PC 2004 上にインストールしたもので確認しています。
(GUI無しの Server インストールで動作しています)

詳細な動作検証は行っていませんがとりあえず普通に動いてそうです。
category11. RDB Firebird  time2007-04-19 02:55

«Prev || 1 | 2 | 3 || Next»