|
|
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指定のテーブルが切断で破棄されてしまうので困ったなあ、
というのが実はこの動機でして……
もしくは、今のものでも同時接続する手段がありますでしょうか?(´・ω・`)
|
|
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日までお待ちいただければ。
うー、楽しみです〜〜(´ω`)
|
|
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"
の後に追加してください。
|
|
2015/8/11(Tue) 17:49:57|NO.70614
SQLserverのリンクサーバー機能を使うのはどうでしょう。
ハンドル関係ないですが、調べた限りだと、リンクサーバーを作りさえすれば、
hspdbからでも使えそうです。
(と言っても作るのが大変だったりする)
|
|
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指定を使いたいわけなのですが……
わがままかしら。(;ω;)
|
|
2015/8/12(Wed) 16:20:35|NO.70649
原因がわかりました。
16ビット整数を指定すべきところに、
32ビット整数を指定していたのが原因でした。
原因はわかったのですが、解決策がわかりません。
すみませんが、しばらくお待ちください。
>書き方、間違えてますでしょうか
いえ、あってると思います。
|
|
2015/8/12(Wed) 17:17:20|NO.70653
了解です!
正座状態でお待ちしております!(´ω`)
|
|
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引数にバッファのサイズを指定しなければならない。

| |
|
2015/8/13(Thu) 12:06:28|NO.70686
どうでしょうか?
反応ください。
|
|
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)を指定してみましたが、それも反映されない模様。
これさえうまくいけば、問題なく動作しそうです。
お手数をおかけしております、よろしくお願いいたします。(´・ω・`)
|
|
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´ω`)
|
|