C++Builder好きの秘密基地 このページをアンテナに追加 RSSフィード

2009-09-09

第14回エンバカデロ・デベロッパーキャンプセッションT3自己フォロー(Delphi/C++Builder DB総ざらい)

C++Builder/Delphi 2010のdbExpressでInterbaseのドライバーを使ってFirebirdに接続するとエラー。
f:id:A7M:20090909205822p:image
Pathは通しているけど、エラーメッセージに"Incompatible version"ってあるから、ドライバーがFbclient.dllリネームしたgds32.dllかどうかチェックしているのかもしれない。
となると、2010のProfessonal版ではローカルでもFirebirdが使えないってこと?*1 当然、Interbaseだと全く問題なし。


あと、CB2007/CB2009/CB2010の共存環境で、MySQL 5.1に接続できない場合がある。
同様のエラーが大阪入りした後に自機のCB2010でも発生したのだけど、Vistaを消してWindows 7クリーンインストールして追試したら問題は発生せず。

一つ気になるのは、MySQLのバージョンをインストールエラーが発生した5.1.37*2ではなく、5.1.38にしたこと。 この辺、何かあるのかもしれない。

*1:ただし、サードパーティ製やオープンソースのドライバーはある。

*2:サービスの登録でエラーが発生するが、サービスそのものは登録され動作する

2009-05-29

データベース関連覚え書き×2


その1:
SQL Server 2008付属の"データのインポートおよびエクスポート"は意外と使える。ADOかODBC経由だけど、MSSQLが絡まないデータ交換もOK。
ただし、テキストやExcel/Accessへのエクスポートはうまくいかない場合がある。


その2:
DB2インストールした後、コマンドプロンプト以下を実行する必要がある

db2 terminate
db2 connect to <database-name>
db2 bind <path>\db2schema.bnd blocking all grant public sqlerror continue
db2 terminate
これを実行しないと、TADOTableとかでテーブル情報とかが取得できない。てか、TableNameを変更するとエラーメッセージが出まくる。
今まで、気にせずにTableNameにスキーマ名ごと無理矢理設定していた。orz でも、C++Builder/Delphi 2009のTADOTableだとテーブル名一覧が取得できるけど、VisualStudio 2008のサーバーエクスプローラーだと、テーブル一覧が取得できないのは何故なんだろう。エラーメッセージ(SQLCODE:SQL0443N SQLSTATE:38553)が出なくなっただけましか。

2007-07-21

C++BuilderでOracle 10gの埋め込みSQLを使ってみた

2chム板の「C++Builder相談室 Part17」にC++BuilderOracle Pro*Cを使う猛者がいたので、試しにやってみた。

1.準備
$(ORACLEHOME)\precomp\LIB\にあるorasql10.libをCOFF2OMFを使ってC++Builderでリンクできるようにする。

coff2omf orasql10.lib orasql10omf.lib

2.ソースのコンパイル
サンプルソース(File1.pc)は以下の通り。

//---------------------------------------------------------------------------
#include <vcl.h> #include <stdio.h> #pragma hdrstop
//---------------------------------------------------------------------------
EXEC SQL INCLUDE SQLCA; EXEC SQL BEGIN DECLARE SECTION; static const char* user = "SCOTT"; static const char* passwd = "TIGER"; static const char* host = "ORCL"; EXEC SQL END DECLARE SECTION;
#pragma argsused int main(int argc, char* argv[]) {
EXEC SQL BEGIN DECLARE SECTION; long empno; char ename[20]; EXEC SQL END DECLARE SECTION;
EXEC SQL CONNECT :user IDENTIFIED BY :passwd USING :host;
EXEC SQL DECLARE CURSOR1 CURSOR FOR SELECT EMPNO, ENAME FROM EMP ORDER BY EMPNO;
EXEC SQL OPEN CURSOR1; EXEC SQL WHENEVER NOT FOUND DO BREAK;
while (1) { EXEC SQL FETCH CURSOR1 INTO :empno, :ename;
printf("EMPNO = %d, ENAME = %s\n", empno, ename); }
EXEC SQL CLOSE CURSOR1;
return 0; } //---------------------------------------------------------------------------
人によっては、きんもーっ☆って思うかもしれないけど、これが埋め込みSQLって奴ね。
Oracleお馴染みのscottユーザーのEMP表を出力してみる。

3.コンパイル&リンク
まず、埋め込みSQLが記述されているソースコードをC/C++コンパイラでコンパイルできるようにする。
やり方は、コマンドプロンプトから直接とか、ビルドイベントとかでも出来るので省略。
コマンドプロンプトからだと、以下のようにproc.exeを実行する。場所は$(ORACLE_HOME)\binの下。

proc code=cpp cpp_suffix=cpp File1.pc
そうするとFile1.cppというファイルが生成されるので、こいつをコンパイル。
リンクには、1で作成したライブラリが必要なので、プロジェクトに追加しておくこと。

実際に実行した結果はこんな感じ。

EMPNO = 7369, ENAME = SMITH
EMPNO = 7499, ENAME = ALLEN
EMPNO = 7521, ENAME = WARD
EMPNO = 7566, ENAME = JONES
EMPNO = 7654, ENAME = MARTIN
EMPNO = 7698, ENAME = BLAKE
EMPNO = 7782, ENAME = CLARK
EMPNO = 7788, ENAME = SCOTT
EMPNO = 7839, ENAME = KING
EMPNO = 7844, ENAME = TURNER
EMPNO = 7876, ENAME = ADAMS
EMPNO = 7900, ENAME = JAMES
EMPNO = 7902, ENAME = FORD
EMPNO = 7934, ENAME = MILLER

埋め込みSQLは、数年前に仕事で使ったことがあるけど、結構デバッグが大変だったな・・・。

2007-01-03

Oracle10g on Solaris10

最初はFedora Core6に突っ込もうと思ったけど、事前に調べたら色々面倒そうなのでSolaris10に。


事前準備:
まずはSolarisの設定から。


  • sendmailのエラーメッセージがウザイしそんなものは使わないので、無効にする。

    # svcadm disable sendmail
    

  • 個人的にautomountは嫌いなので、ホームディレクトリのautomountを無効にする。(参考:http://www.b-dash.net/solaris/solaris_5.html

    /etc/auto_masterの/homeの行をコメントアウトすればおk。
  • rootでログインして、ユーザーOracle、グループOracleを作った方が吉。グループとユーザーの作成はsmc(Solaris Management Console)のほうが便利。

    かつてのadmintoolの糞さ加減と比べたら・・・。(´Д⊂グスン
  • Oracle10gのインストーラーを起動すると、「SUNWi5csとSUNWi15csが無い」と怒られるので、メディアからインストール

    # cd /cdrom/Solaris_10/Product/
    # pkgadd -d . SUNWi5cs
    # pkgadd -d . SUNWi15cs
    

  • 同じく、カーネルパラメータが違うと怒られるので、/etc/systemを編集して以下の行を追加。

    set semsys:seminfo_semmni=100
    set semsys:seminfo_semmns=1024
    set semsys:seminfo_semmsl=256
    set shmsys:shminfo_shmmax=4294967295
    set shmsys:shminfo_shmmin=1
    set shmsys:shminfo_shmmni=100
    set shmsys:shminfo_shmseg=10
    

    編集したら、カーネルの再構成が必要なので再起動。

  • 今度は、swapのサイズが少ないと怒られるので、swapサイズを追加。

    # mkfile -v 1024M /home/swapfile
    # /usr/sbin/swap -a /home/swapfile
    

    う〜ん、メモリ3GB、swap512MBでも怒られるのか・・・。


インストール

インストールはユーザーoracleで実行。

  • OTN(US)様から、Oracle10gをダウソ。(‐人‐)アリガタヤ、アリガタヤ。
  • 落としたzipを解凍して、database/runInstallerを実行。
  • インストールはインストーラーの指示に従っていればとりあえずおk。てか、一度失敗していたりするwwww
  • 環境変数を設定。シェルはsh/bashがいいみたいなので.profileを編集。

    export ORACLE_SID=ORCL
    export ORACLE_HOME=/home/oracle/oracle/product/10.2.0/db_1
    export NLS_LANG=JAPANESE_JAPAN.JA16EUC
    

    同様に、$ORACLE_HOME/binをpathに、$ORACLE_HOME/libをLD_LIBRARY_PATHに追加すること。

  • $ORACLE_HOME/bin/netca(Net Configlation Assistant)を実行して、リスナなどを設定する。
  • /var/opt/oracle/oratabを編集して、項目の最終フィールドをYにする。

起動&停止:

起動は以下の順番。

% dbstart $ORACLE_HOME
% lsnrctl start
% emctl start dbconsole

停止は起動の逆。

% emctl stop dbconsole
% lsnrctl stop
% dbshut $ORACLE_HOME

本当は、SMFで管理するのが筋だろうけど、面倒なのでそこまでは追求しないw

追記1:

インストール先は、/opt/oracleでもよかったかも。


追記2:

Enterprise Managerが起動しない場合、$ORACLE_HOME/ホスト名_$ORACLE_SID/の下に、emctl.pidがあるか確認すること。

emctl.pidがあると起動しないので、削除してから再チャレンジ。てか、これに気がつくまで数時間かかった。orz

Enterprise Managerへのアクセスは、http://ホスト名:1158/em/で。