HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0810
(´ω`)hspdbの、ハンドルによる複数同時接続対応化キボンヌ17解決


(´ω`)

リンク

2015/8/10(Mon) 12:29:59|NO.70587

タイトルそのまんまですが。(u´ω`)

いま、hspdbによるDBへの接続って、同時に1か所だけじゃないですか。
それを、ハンドル保持により複数DBへの同時接続&アクセスができるようになると、
なんか色々ステキだなあって。

いや、ローカルにも外部にもMySQLサーバがあって、それに同時にアクセスしながら
データの編集をしたいという個人的欲求なだけですが、

hdl = dbopen("driver=MySQL ODBC 3.51 Driver;〜")
みたいにして同時に複数の鯖のハンドル取得、以降はハンドル指定で

dbsend hdl, "SELECT id, name, age FROM customer;" dbsend hdl2, "INSERT INTO customer VALUES(〜);"
て感じで出来たらすてき。

てか、接続&切断を繰り返せば今でも同時アクセスはできんこともないですが、その際
サーバで作ったTEMPORARY指定のテーブルが切断で破棄されてしまうので困ったなあ、
というのが実はこの動機でして……

もしくは、今のものでも同時接続する手段がありますでしょうか?(´・ω・`)



この記事に返信する


tds12

リンク

2015/8/10(Mon) 21:32:35|NO.70597

勢いで書いてしまいました。
自由に使ってください。
このようでどうでしょうか。

#ifndef _MOD_CEZDB_AS_ #define _MOD_CEZDB_AS_ #module MOD_CEZDB flag,henv,hdbc,hstmt,ResultOut,StringOut,sepchr #define SQL_SUCCESS 0 #define SQL_NTS $FFFFFFFD #define SQL_DRIVER_COMPLETE_REQUIRED $00000003 #define SQL_DRIVER_NOPROMPT $00000000 #define SQL_DROP $00000001 #define SQL_SUCCESS_WITH_INFO $00000001 #define SQL_C_CHAR $00000001 #uselib "odbc32.dll" #cfunc SQLAllocEnv "SQLAllocEnv" int #cfunc SQLAllocConnect "SQLAllocConnect" int,int #cfunc SQLAllocStmt "SQLAllocStmt" int,int #cfunc SQLDriverConnect "SQLDriverConnect" int,int,int,int,int,int,int,int #cfunc SQLExecDirect "SQLExecDirect" int,int,int #cfunc SQLFetch "SQLFetch" int #func SQLGetData "SQLGetData" int,int,int,int,int,int #func SQLDisconnect "SQLDisconnect" int #func SQLFreeEnv "SQLFreeEnv" int #func SQLFreeConnect "SQLFreeConnect" int #func SQLFreeStmt "SQLFreeStmt" int,int #uselib "msvcrt.dll" #cfunc cstrlen "strlen" int #define CEZDB_MODE_NONE 0 #define CEZDB_MODE_ERROR 1 #define CEZDB_MODE_ENVREADY 2 #define CEZDB_MODE_DBCREADY 3 #define CEZDB_MODE_SQLFETCH 4 #define CEZDB_MODE_MAX 5 #define CEZDB_OUTBUFSIZE 1024 #modinit res = 0 flag = CEZDB_MODE_NONE henv = 0 StringOut = "" ResultOut = "" sepchr = ',' res = SQLAllocEnv(varptr(henv)) if res != SQL_SUCCESS{ flag = CEZDB_MODE_ERROR return } sdim StringOut,CEZDB_OUTBUFSIZE sdim ResultOut,CEZDB_OUTBUFSIZE flag = CEZDB_MODE_ENVREADY mref tmpownid,2 ownid = tmpownid dim tmpownid return ownid #modterm cezdb_Disconnect if henv != 0{ SQLFreeEnv henv henv = 0 } sdim StringOut sdim ResultOut flag = CEZDB_MODE_NONE return #modcfunc cezdb_Connect str _dsn,int mode dsn = _dsn res = 0 if flag != CEZDB_MODE_ENVREADY:return -1 res = SQLAllocConnect(henv,varptr(hdbc)) if res != SQL_SUCCESS{ flag = CEZDB_MODE_ERROR return -2 } switch mode case 1 res = SQLDriverConnect(hdbc,0,varptr(dsn),SQL_NTS,varptr(StringOut),CEZDB_BUFSIZE,0,SQL_DRIVER_COMPLETE_REQUIRED) swbreak default res = SQLDriverConnect(hdbc,0,varptr(dsn),SQL_NTS,varptr(StringOut),CEZDB_BUFSIZE,0,SQL_DRIVER_NOPROMPT) swbreak swend if res != SQL_SUCCESS{ SQLFreeConnect hdbc flag = CEZDB_MODE_ERROR return -3 } flag = CEZDB_MODE_DBCREADY return 0 #modfunc cezdb_Disconnect if flag >= CEZDB_MODE_DBCREADY{ if flag == CEZDB_MODE_SQLFETCH:SQLFreeStmt hstmt,SQL_DROP SQLDisconnect hdbc SQLFreeConnect hdbc flag = CEZDB_MODE_ENVREADY } return #modcfunc cezdb_SendSQL str _pstr pstr = _pstr res = 0 if flag != CEZDB_MODE_DBCREADY:return -1 res = SQLAllocStmt(hdbc,varptr(hstmt)) if res != SQL_SUCCESS{ return -2 } res = SQLExecDirect(hstmt,varptr(pstr),SQL_NTS) if (res != SQL_SUCCESS)&&(res != SQL_SUCCESS_WITH_INFO){ return -3 } flag = CEZDB_MODE_SQLFETCH return 0 #modcfunc cezdb_GetResult var buf,int size res = 0 leftsize = 0 column = 0 maxcol = 0 sz = 0 len = 0 if flag != CEZDB_MODE_SQLFETCH:return -1 res = SQLFetch(hstmt) if (res != SQL_SUCCESS)&&(res != SQL_SUCCESS_WITH_INFO){ SQLFreeStmt hstmt,SQL_DROP flag = CEZDB_MODE_DBCREADY return -2 } column = 1 res = SQLNumResultCols(hstmt,varptr(maxcol)) if res != SQL_SUCCESS:maxcol = 1 leftsize = size p = varptr(buf) poke buf,p - varptr(buf),0 repeat -1 if column > maxcol:break if leftsize < 1:break res = SQLGetData(hstmt,column,SQL_C_CHAR,p,leftsize,varptr(len)) if (res != SQL_SUCCESS)&&(res != SQL_SUCCESS_WITH_INFO):break column++ len = cstrlen(p) p + len leftsize - len if leftsize < 1:break p++ poke buf,p - varptr(buf),sepchr leftsize-- loop poke buf,p - varptr(buf),0 sz = cstrlen(varptr(buf)) if sz{ if peek(buf,sz - 1) == sepchr:poke buf,sz - 1,0 } return sz #modcfunc cezdb_GetResultBuffer if cezdb_GetResult(thismod,ResultOut,CEZDB_OUTBUFSIZE) < 0:return "" return ResultOut #modcfunc cezdb_GetMode return flag #modfunc cezdb_SetSeparator int chr sepchr = chr return #global #endif #ifndef _MOD_HSPDB_AS_ #define _MOD_HSPDB_AS_ #module MOD_HSPDB #define CEZDB_MODE_NONE 0 #define CEZDB_MODE_ERROR 1 #define CEZDB_MODE_ENVREADY 2 #define CEZDB_MODE_DBCREADY 3 #define CEZDB_MODE_SQLFETCH 4 #define CEZDB_MODE_MAX 5 #defcfunc dbini newmod db,MOD_CEZDB dbid = stat if cezdb_GetMode(db(dbid)) == CEZDB_MODE_ERROR:return -1 return dbid #deffunc dbbye int _dbid if varuse(db(_dbid)) != 0:delmod db(_dbid) return 0 #deffunc dbopen int _dbid,str ep1,int ep2 res = cezdb_Connect(db(_dbid),ep1,ep2) return res #deffunc dbclose int _dbid cezdb_DisConnect db(_dbid) return 0 #deffunc dbstat int _dbid return -cezdb_GetMode(db(_dbid)) #deffunc dbsend int _dbid,str ep1 res = cezdb_SendSQL(db(_dbid),ep1) return res #deffunc dbgets int _dbid,var p1,int size poke p1,0,0 i = cezdb_GetResult(db(_dbid),p1,size) if i < 0:return i return 0 #deffunc dbspchr int _dbid,int p1 cezdb_SetSeparator db(_dbid),p1 return 0 #global #endif //複数同時接続データベースモジュール //使い方 // hspdbとほぼ同じように使うことができます。 //hspdbと異なる点 // dbini命令が関数となり、 // その戻り値を他の命令の第1引数に指定しなければならない。 // これにより、複数のデータベースへ同時に接続できる。 // dbgets命令に引数の変更がある。 // 第3引数にバッファのサイズを指定しなければならない。
なお、文法上正しいことは確認したつもりですが、
正しく実行できるかは確認できなかったので、
確認できた人は結果を投稿していただけると嬉しいです。



(´ω`)

リンク

2015/8/11(Tue) 00:32:06|NO.70601

ぬおおおおおおお!これはまた、なんちゅうものを!
ありがとうございます!!(* ゚ω゚ *)

今は手元にテスト環境がないので、恐縮ですが12日までお待ちいただければ。
うー、楽しみです〜〜(´ω`)



tds12

リンク

2015/8/11(Tue) 16:17:58|NO.70612

スクリプトの間違いを見つけました。

#func SQLGetData "SQLGetData" int,int,int,int,int,int


#cfunc SQLGetData "SQLGetData" int,int,int,int,int,int
に変更し、

#cfunc SQLNumResultCols "SQLNumResultCols" int,int


#uselib "odbc32.dll"
の後に追加してください。



kanamaru

リンク

2015/8/11(Tue) 17:49:57|NO.70614

SQLserverのリンクサーバー機能を使うのはどうでしょう。
ハンドル関係ないですが、調べた限りだと、リンクサーバーを作りさえすれば、
hspdbからでも使えそうです。
(と言っても作るのが大変だったりする)



kanamaru

リンク

2015/8/11(Tue) 18:02:42|NO.70615

少し言葉を訂正します。
hspdbからでも使えそうです。
ではなくて
hspdbの文法そのものが使えそうです。



(´ω`)

リンク

2015/8/12(Wed) 07:36:33|NO.70642

あっれ?接続できない?( ゚ω゚ )

tds12様のソースを mod_db.as ってな名前にして include して、
んで以下のようなコードで同時アクセス&それぞれにテーブルを生成し、
テーブルがそれぞれ別の場所にあることを確認するのんを作ってみましたが……

#include "mod_db.as" hdl01 = dbini() hdl02 = dbini() dbopen hdl01, "driver=MySQL ODBC 3.51 Driver;server=(鯖1);user=(ID1);password=(パス1);port=(ポート1);charset=cp932;" dbsend hdl01, "USE (スキーマ1);" : gosub *fetch01 dbopen hdl02, "driver=MySQL ODBC 3.51 Driver;server=(鯖2);user=(ID2);password=(パス2);port=(ポート2);charset=cp932;" dbsend hdl02, "USE (スキーマ2);" : gosub *fetch02 dbsend hdl01, "CREATE TABLE test01 (id INTEGER, name TEXT);" : gosub *fetch01 dbsend hdl01, "INSERT INTO test01 VALUES(1,'douya');" : gosub *fetch01 dbsend hdl02, "CREATE TABLE test02 (id INTEGER, name TEXT);" : gosub *fetch02 dbsend hdl02, "INSERT INTO test02 VALUES(2,'donaiya');" : gosub *fetch02 dbsend hdl01, "SELECT * FROM test02;" : gosub *fetch01 mes "hdl01:"+sqlresult dbsend hdl02, "SELECT * FROM test02;" : gosub *fetch02 mes "hdl02:"+sqlresult dbclose hdl01 : dbbye hdl01 dbclose hdl02 : dbbye hdl02 end *fetch01 sqlresult = "" repeat sdim row, 1024 dbgets hdl01, row, 1024 sqlresult = sqlresult + row + "\n" if stat!=0 { break } loop return *fetch02 sqlresult = "" repeat sdim row, 1024 dbgets hdl02, row, 1024 sqlresult = sqlresult + row + "\n" if stat!=0 { break } loop return
テーブルが生成されていない。
MySQL Administratorで見てみると、接続そのものができていないようなのです。

書き方、間違えてますでしょうか?(´・ω・`)



(´ω`)

リンク

2015/8/12(Wed) 08:37:18|NO.70643

>kanamaru 様

SQL Server のリンクサーバ機能……なるほど!( ゚ω゚ )
SQL Server のクエリとして、別サーバへの問い合わせを書けるのか!
確かにこれなら……

……むう、便利なのですが、どうやらこれもクエリ毎に接続・切断をするような。
1台のMySQLサーバに対し、同じテーブル生成クエリを同時に10台近いマシンで
実行する可能性があるので、何とかTEMPORARY指定を使いたいわけなのですが……

わがままかしら。(;ω;)



tds12

リンク

2015/8/12(Wed) 16:20:35|NO.70649

原因がわかりました。
16ビット整数を指定すべきところに、
32ビット整数を指定していたのが原因でした。

原因はわかったのですが、解決策がわかりません。
すみませんが、しばらくお待ちください。

>書き方、間違えてますでしょうか
いえ、あってると思います。



(´ω`)

リンク

2015/8/12(Wed) 17:17:20|NO.70653

了解です!
正座状態でお待ちしております!(´ω`)



tds12

リンク

2015/8/12(Wed) 19:33:50|NO.70660

出来ました。
これでどうでしょう。

#ifndef _MOD_CEZDB_AS_ #define _MOD_CEZDB_AS_ #module MOD_CEZDB flag,henv,hdbc,hstmt,ResultOut,StringOut,sepchr #define SQL_SUCCESS 0 #define SQL_NTS $FFFFFFFD #define SQL_DRIVER_COMPLETE_REQUIRED $00000003 #define SQL_DRIVER_NOPROMPT $00000000 #define SQL_DROP $00000001 #define SQL_SUCCESS_WITH_INFO $00000001 #define SQL_C_CHAR $00000001 #uselib "odbc32.dll" #cfunc SQLAllocEnv "SQLAllocEnv" int #cfunc SQLAllocConnect "SQLAllocConnect" int,int #cfunc SQLAllocStmt "SQLAllocStmt" int,int #cfunc SQLDriverConnect "SQLDriverConnect" int,int,int,int,int,int,int,int #cfunc SQLExecDirect "SQLExecDirect" int,int,int #cfunc SQLFetch "SQLFetch" int #cfunc SQLNumResultCols "SQLNumResultCols" int,int #cfunc SQLGetData "SQLGetData" int,int,int,int,int,int #func SQLDisconnect "SQLDisconnect" int #func SQLFreeEnv "SQLFreeEnv" int #func SQLFreeConnect "SQLFreeConnect" int #func SQLFreeStmt "SQLFreeStmt" int,int #uselib "msvcrt.dll" #cfunc cstrlen "strlen" int #define CEZDB_MODE_NONE 0 #define CEZDB_MODE_ERROR 1 #define CEZDB_MODE_ENVREADY 2 #define CEZDB_MODE_DBCREADY 3 #define CEZDB_MODE_SQLFETCH 4 #define CEZDB_MODE_MAX 5 #define CEZDB_OUTBUFSIZE 1024 #modinit res = 0 flag = CEZDB_MODE_NONE henv = 0 StringOut = "" ResultOut = "" sepchr = ',' res = SQLAllocEnv(varptr(henv))&$ffff if res != SQL_SUCCESS{ flag = CEZDB_MODE_ERROR return } sdim StringOut,CEZDB_OUTBUFSIZE sdim ResultOut,CEZDB_OUTBUFSIZE flag = CEZDB_MODE_ENVREADY mref tmpownid,2 ownid = tmpownid dim tmpownid return ownid #modterm cezdb_Disconnect thismod if henv != 0{ SQLFreeEnv henv henv = 0 } sdim StringOut sdim ResultOut flag = CEZDB_MODE_NONE return #modcfunc cezdb_Connect str _dsn,int mode dsn = _dsn res = 0 if flag != CEZDB_MODE_ENVREADY:return -1 res = SQLAllocConnect(henv,varptr(hdbc))&$ffff if res != SQL_SUCCESS{ flag = CEZDB_MODE_ERROR return -2 } switch mode case 1 res = SQLDriverConnect(hdbc,0,varptr(dsn),SQL_NTS,varptr(StringOut),CEZDB_BUFSIZE,0,SQL_DRIVER_COMPLETE_REQUIRED)&$ffff swbreak default res = SQLDriverConnect(hdbc,0,varptr(dsn),SQL_NTS,varptr(StringOut),CEZDB_BUFSIZE,0,SQL_DRIVER_NOPROMPT)&$ffff swbreak swend if res != SQL_SUCCESS{ SQLFreeConnect hdbc flag = CEZDB_MODE_ERROR return -3 } flag = CEZDB_MODE_DBCREADY return 0 #modfunc cezdb_Disconnect if flag >= CEZDB_MODE_DBCREADY{ if flag == CEZDB_MODE_SQLFETCH:SQLFreeStmt hstmt,SQL_DROP SQLDisconnect hdbc SQLFreeConnect hdbc flag = CEZDB_MODE_ENVREADY } return #modcfunc cezdb_SendSQL str _pstr pstr = _pstr res = 0 if flag != CEZDB_MODE_DBCREADY:return -1 res = SQLAllocStmt(hdbc,varptr(hstmt))&$ffff if res != SQL_SUCCESS{ return -2 } res = SQLExecDirect(hstmt,varptr(pstr),SQL_NTS)&$ffff if (res != SQL_SUCCESS)&&(res != SQL_SUCCESS_WITH_INFO){ return -3 } flag = CEZDB_MODE_SQLFETCH return 0 #modcfunc cezdb_GetResult var buf,int size res = 0 leftsize = 0 column = 0 maxcol = 0 sz = 0 len = 0 if flag != CEZDB_MODE_SQLFETCH:return -1 res = SQLFetch(hstmt)&$ffff if (res != SQL_SUCCESS)&&(res != SQL_SUCCESS_WITH_INFO){ SQLFreeStmt hstmt,SQL_DROP flag = CEZDB_MODE_DBCREADY return -2 } column = 1 res = SQLNumResultCols(hstmt,varptr(maxcol))&$ffff if res != SQL_SUCCESS:maxcol = 1 leftsize = size p = varptr(buf) poke buf,p - varptr(buf),0 repeat -1 if column > maxcol:break if leftsize < 1:break res = SQLGetData(hstmt,column,SQL_C_CHAR,p,leftsize,varptr(len))&$ffff if (res != SQL_SUCCESS)&&(res != SQL_SUCCESS_WITH_INFO):break column++ len = cstrlen(p) p + len leftsize - len if leftsize < 1:break p++ poke buf,p - varptr(buf),sepchr leftsize-- loop poke buf,p - varptr(buf),0 sz = cstrlen(varptr(buf)) if sz{ if peek(buf,sz - 1) == sepchr:poke buf,sz - 1,0 } return sz #modcfunc cezdb_GetResultBuffer if cezdb_GetResult(thismod,ResultOut,CEZDB_OUTBUFSIZE) < 0:return "" return ResultOut #modcfunc cezdb_GetMode return flag #modfunc cezdb_SetSeparator int chr sepchr = chr return #global #endif #ifndef _MOD_HSPDB_AS_ #define _MOD_HSPDB_AS_ #module MOD_HSPDB #define CEZDB_MODE_NONE 0 #define CEZDB_MODE_ERROR 1 #define CEZDB_MODE_ENVREADY 2 #define CEZDB_MODE_DBCREADY 3 #define CEZDB_MODE_SQLFETCH 4 #define CEZDB_MODE_MAX 5 #deffunc dbclear onexit if vartype(db) == vartype("struct"){ foreach db delmod db(cnt) loop } return #defcfunc dbini newmod db,MOD_CEZDB dbid = stat if cezdb_GetMode(db(dbid)) == CEZDB_MODE_ERROR:return -1 return dbid #deffunc dbbye int _dbid if varuse(db(_dbid)) != 0:delmod db(_dbid) return 0 #deffunc dbopen int _dbid,str ep1,int ep2 res = cezdb_Connect(db(_dbid),ep1,ep2) return res #deffunc dbclose int _dbid cezdb_DisConnect db(_dbid) return 0 #deffunc dbstat int _dbid return -cezdb_GetMode(db(_dbid)) #deffunc dbsend int _dbid,str ep1 res = cezdb_SendSQL(db(_dbid),ep1) return res #deffunc dbgets int _dbid,var p1,int size poke p1,0,0 i = cezdb_GetResult(db(_dbid),p1,size) if i < 0:return i return 0 #deffunc dbspchr int _dbid,int p1 cezdb_SetSeparator db(_dbid),p1 return 0 #global #endif //複数同時接続データベースモジュール //使い方 // hspdbとほぼ同じように使うことができます。 //hspdbと異なる点 // dbini命令が関数となり、 // その戻り値を他の命令の第1引数に指定しなければならない。 // これにより、複数のデータベースへ同時に接続できる。 // dbgets命令に引数の変更がある。 // 第3引数にバッファのサイズを指定しなければならない。



tds12

リンク

2015/8/13(Thu) 12:06:28|NO.70686

どうでしょうか?
反応ください。



kanamaru

リンク

2015/8/13(Thu) 12:37:31|NO.70690

リンクサーバを使う方法が簡単そうなので、さらにいろいろ調べて、
テンポラリ指定のテーブルを消さずにすむ方法を調べたところ、
SQLserverのリンクサーバ機能に加えて、SQLserverの同時実行制御が使えないか、
という結論に至りました。
僕は詳しいわけではないので、サンプルの提示は無理ですが、
お試しください



(´ω`)

リンク

2015/8/16(Sun) 09:25:47|NO.70791

お盆の帰省で遅くなりました!(u´ω`)

早速テストさせていただきました。
接続、テーブル作成、データ挿入までは問題なく動作いたしました。ところが、
データ取得がうまくいきません。2列のデータなのに、1列分しか取得ができない。

取得したデータを見たところ、どうもセパレータがヌル(0)になってるようです。
そのため、2列目以降の文字列が見えない。
dbspchr でカンマ(44)を指定してみましたが、それも反映されない模様。

これさえうまくいけば、問題なく動作しそうです。
お手数をおかけしております、よろしくお願いいたします。(´・ω・`)



tds12

リンク

2015/8/16(Sun) 11:30:45|NO.70799

cezdb_GetResult関数を↓で置き換えてみてください。

#modcfunc cezdb_GetResult var buf,int size res = 0 leftsize = 0 column = 0 maxcol = 0 sz = 0 len = 0 if flag != CEZDB_MODE_SQLFETCH:return -1 res = SQLFetch(hstmt)&$ffff if (res != SQL_SUCCESS)&&(res != SQL_SUCCESS_WITH_INFO){ SQLFreeStmt hstmt,SQL_DROP flag = CEZDB_MODE_DBCREADY return -2 } column = 1 res = SQLNumResultCols(hstmt,varptr(maxcol))&$ffff if res != SQL_SUCCESS:maxcol = 1 leftsize = size p = varptr(buf) poke buf,p - varptr(buf),0 repeat -1 if column > maxcol:break if leftsize < 1:break res = SQLGetData(hstmt,column,SQL_C_CHAR,p,leftsize,varptr(len))&$ffff if (res != SQL_SUCCESS)&&(res != SQL_SUCCESS_WITH_INFO):break column++ len = cstrlen(p) p + len leftsize - len if leftsize < 1:break poke buf,p - varptr(buf),sepchr p++ leftsize-- loop poke buf,p - varptr(buf),0 sz = cstrlen(varptr(buf)) if sz{ if peek(buf,sz - 1) == sepchr:poke buf,sz - 1,0 } return sz
どうでしょうか。



(´ω`)

リンク

2015/8/16(Sun) 12:08:50|NO.70800

ばっちりです、いけました!
やばい、これマジで大革命!(* ゚ω゚ *)

異なる2つのサーバに接続し、それぞれで別のテーブルを作り、
それぞれが別の場所に作られたものであることの確認までの、ひととおりに成功。
先ほどはうまくいかなかったと言った dbspchr の反映もできました。

これ、マジでいいですわ……これでデスマーチもがんばれます。
感謝が溢れて言葉になりません。(;ω;)



(´ω`)

リンク

2015/8/16(Sun) 12:39:49|NO.70803

さらに追記。

HSPDB との処理速度比較では、約1.22倍くらい重くなるようです。
常時コレで処理するのはキツいかも。

tds12様謹製の方は、命令の名称をちょい変更しておいて(dbsend→dbsend2、みたく)
両方とも組み込んでおく。んで、通常は HSPDB で処理を行い、複数同時接続が必要な場面では
コレを駆使する、というのでいこうかなと。

ていうか、そうやってみたら両者ともちゃんと動きました。
これまでのソースを書き換えることなく、要所々々でパワーアップできそうです。

本当に、ありがとうございます。
心からお礼申し上げます。(´ω`)



(´ω`)

リンク

2015/8/17(Mon) 15:49:51|NO.70833

さらにさらに追記。

tds12様のモジュール MOD_HSPDB 側の最後あたりに追加すると便利になるコマンドを。
DB操作で必ず必要になるフェッチのコマンドです。

// dbfetch フェッチコマンド //  書式:dbfetch [ハンドル] //  refstrに結果の文字列が入る // 使い方 //  dbsend hdl, "SELECT * FROM datas;" : dbfetch hdl //   #deffunc dbfetch int hdl handle = hdl : result = "" repeat sdim row, 1024 dbgets handle, row, 2014 fl = stat result += row + "\n" if fl!=0 { break } loop return result

実行速度ですが、いろいろ条件を変えるとHSPDBと殆ど変わらない、あるいはこっちのが
なぜか速いという結果がでました。なぜかしら。(u´ω`)



ONION software Copyright 1997-2023(c) All rights reserved.