如何从COBOL开始使用SQLite
我是COBOL开发人员,需要连接到SQLite数据库。我正在使用NetExpress。 我看到了这个,也看到了这个,但我需要上一步。我不知道如何将这些c调用传递给COBOL。 该指南解释说:如何从COBOL开始使用SQLite,sqlite,cobol,Sqlite,Cobol,我是COBOL开发人员,需要连接到SQLite数据库。我正在使用NetExpress。 我看到了这个,也看到了这个,但我需要上一步。我不知道如何将这些c调用传递给COBOL。 该指南解释说: sqlite3_open("test.db", &db) sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg) 我有一个数据库“test.db”,有一个表“tabla”,有两列(键入
sqlite3_open("test.db", &db)
sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg)
我有一个数据库“test.db”,有一个表“tabla”,有两列(键入text)。
我尝试使用此COBOL解决方案打开/插入/选择:
*
*----------------------------------------------------------------*
* *
* *
* *
* SYSTEM *
* *
* PROGRAM-ID Pxxxxxx
* *
* AUTHOR *
* *
* DATE 10/2016 *
* *
* *
* *
* *
*----------------------------------------------------------------*
* *
* *
* *
*----------------------------------------------------------------*
IDENTIFICATION DIVISION.
PROGRAM-ID. Pxxxxxx.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
/----------------------------------------------------------------*
INPUT-OUTPUT SECTION.
FILE-CONTROL.
*----------------------------------------------------------------*
/----------------------------------------------------------------*
DATA DIVISION.
FILE SECTION.
*----------------------------------------------------------------*
/----------------------------------------------------------------*
WORKING-STORAGE SECTION.
*----------------------------------------------------------------*
01 proc-ptr usage procedure-pointer.
01 sqlite3-db pointer.
01 err-msg pointer.
01 sqlite pointer.
01 res pointer.
01 rc pic 9 comp-5.
01 dbName pic x(08).
01 sqlQuery pic x(100).
01 result pic x(100).
01 argv.
03 firstColumn pointer.
03 secondColumn pointer.
01 azColName pointer.
01 argc pic 99 comp-5.
01 notused pointer.
01 Writefunction-Ptr procedure-pointer.
01 PERSON-POST.
03 NAMN PIC X(60).
03 AGE PIC 9(3).
03 ADRESS PIC X(100).
03 TELNR PIC X(20).
01 Column-Id pic X(3).
01 Column-Name pic X(20).
*-----------------------------------------------------------------
Linkage Section.
/-----------------------------------------------------------------
procedure division.
*-----------------------------------------------------------------
*
set proc-ptr to entry "sqlite3.dll"
display sqlQuery
set sqlite3-db to null
set err-msg to null
set res to null
move z"test.db" to dbName
display "Running sqlite3_open"
call "sqlite3_open" using
by reference z"test.db"
by reference sqlite3-db
returning rc
end-call
if rc not = zero
display "error opening database."
else
display "database opened."
end-if
move "INSERT INTO tabla VALUES ('020', '8855');"
to sqlQuery
initialize Column-Id
initialize Column-Name
*
*
*
call "sqlite3_exec" using
by value sqlite3-db
by reference sqlQuery
by value 0
by value 0
by reference err-msg
returning rc
end-call
set Writefunction-Ptr to entry "sqlite-callback".
initialize sqlQuery
move "SELECT * FROM tabla;" to sqlQuery
call "sqlite3_exec" using
by value sqlite3-db
by reference sqlQuery
by value Writefunction-Ptr
by value 0
by reference err-msg
returning rc
end-call
*
entry "sqlite-callback" using
by value notused
by value argc
by reference argv
by reference azColName.
* how to get column1
* how to get column2
display Column-Id "|" Column-Name
*
call "sqlite3_close" using
by reference sqlite3-db
end-call
display "sqlite3_close"
.
*----------------------------------------------------------------
stop run.
Entry-Termination.
现在,open和insert工作正常,但我需要知道如何从Select语句中获取记录。我需要获得几行并显示它们。最后,这是在netExpress中打开/插入/选择/关闭的代码:
*
*----------------------------------------------------------------*
* *
* *
* *
* SYSTEM *
* *
* PROGRAM-ID Pxxxxxx
* *
* AUTHOR *
* *
* DATE 10/2016 *
* *
* *
* *
* *
*----------------------------------------------------------------*
* *
* *
* *
*----------------------------------------------------------------*
IDENTIFICATION DIVISION.
PROGRAM-ID. Pxxxxx.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
/----------------------------------------------------------------*
INPUT-OUTPUT SECTION.
FILE-CONTROL.
*----------------------------------------------------------------*
/----------------------------------------------------------------*
DATA DIVISION.
FILE SECTION.
*----------------------------------------------------------------*
/----------------------------------------------------------------*
WORKING-STORAGE SECTION.
*----------------------------------------------------------------*
01 proc-ptr usage procedure-pointer.
01 sqlite3-db pointer.
01 err-msg pointer.
01 sqlite pointer.
01 res pointer.
01 rc pic 9 comp-5.
01 dbName pic x(08).
01 sqlQuery pic x(100).
01 result pic x(100).
01 argv.
03 firstColumn pointer.
03 secondColumn pointer.
01 azColName pointer.
01 argc pic 99 comp-5.
01 notused pointer.
01 Writefunction-Ptr procedure-pointer.
*-----------------------------------------------------------------
Local-storage Section.
Linkage Section.
01 Column-Id pic X(3).
01 Column-Name pic X(20).
/-----------------------------------------------------------------
procedure division.
*-----------------------------------------------------------------
*
set proc-ptr to entry "sqlite3.dll"
display sqlQuery
set sqlite3-db to null
set err-msg to null
set res to null
move z"test.db" to dbName
display "Running sqlite3_open"
call "sqlite3_open" using
by reference z"test.db"
by reference sqlite3-db
returning rc
end-call
if rc not = zero
display "error opening database."
else
display "database opened."
end-if
move "INSERT INTO tabla VALUES ('002', '8855');"
to sqlQuery
*
*
*
call "sqlite3_exec" using
by value sqlite3-db
by reference sqlQuery
by value 0
by value 0
by reference err-msg
returning rc
end-call
*
set Writefunction-Ptr to entry "sqlite-callback".
initialize sqlQuery
move "SELECT * FROM tabla;" to sqlQuery
call "sqlite3_exec" using
by value sqlite3-db
by reference sqlQuery
by value Writefunction-Ptr
by value 0
by reference err-msg
returning rc
end-call
call "sqlite3_close" using
by reference sqlite3-db
end-call
display "sqlite3_close"
.
* -------------------------------------------------------
stop run.
entry "sqlite-callback"
using
by value notused
by value argc
by reference argv
by reference azColName.
set address of Column-Id to firstColumn
set address of Column-Name to secondColumn
display Column-id "|" Column-Name
goback.
Entry-Termination.
最后,这是在netExpress中打开/插入/选择/关闭的代码:
*
*----------------------------------------------------------------*
* *
* *
* *
* SYSTEM *
* *
* PROGRAM-ID Pxxxxxx
* *
* AUTHOR *
* *
* DATE 10/2016 *
* *
* *
* *
* *
*----------------------------------------------------------------*
* *
* *
* *
*----------------------------------------------------------------*
IDENTIFICATION DIVISION.
PROGRAM-ID. Pxxxxx.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
/----------------------------------------------------------------*
INPUT-OUTPUT SECTION.
FILE-CONTROL.
*----------------------------------------------------------------*
/----------------------------------------------------------------*
DATA DIVISION.
FILE SECTION.
*----------------------------------------------------------------*
/----------------------------------------------------------------*
WORKING-STORAGE SECTION.
*----------------------------------------------------------------*
01 proc-ptr usage procedure-pointer.
01 sqlite3-db pointer.
01 err-msg pointer.
01 sqlite pointer.
01 res pointer.
01 rc pic 9 comp-5.
01 dbName pic x(08).
01 sqlQuery pic x(100).
01 result pic x(100).
01 argv.
03 firstColumn pointer.
03 secondColumn pointer.
01 azColName pointer.
01 argc pic 99 comp-5.
01 notused pointer.
01 Writefunction-Ptr procedure-pointer.
*-----------------------------------------------------------------
Local-storage Section.
Linkage Section.
01 Column-Id pic X(3).
01 Column-Name pic X(20).
/-----------------------------------------------------------------
procedure division.
*-----------------------------------------------------------------
*
set proc-ptr to entry "sqlite3.dll"
display sqlQuery
set sqlite3-db to null
set err-msg to null
set res to null
move z"test.db" to dbName
display "Running sqlite3_open"
call "sqlite3_open" using
by reference z"test.db"
by reference sqlite3-db
returning rc
end-call
if rc not = zero
display "error opening database."
else
display "database opened."
end-if
move "INSERT INTO tabla VALUES ('002', '8855');"
to sqlQuery
*
*
*
call "sqlite3_exec" using
by value sqlite3-db
by reference sqlQuery
by value 0
by value 0
by reference err-msg
returning rc
end-call
*
set Writefunction-Ptr to entry "sqlite-callback".
initialize sqlQuery
move "SELECT * FROM tabla;" to sqlQuery
call "sqlite3_exec" using
by value sqlite3-db
by reference sqlQuery
by value Writefunction-Ptr
by value 0
by reference err-msg
returning rc
end-call
call "sqlite3_close" using
by reference sqlite3-db
end-call
display "sqlite3_close"
.
* -------------------------------------------------------
stop run.
entry "sqlite-callback"
using
by value notused
by value argc
by reference argv
by reference azColName.
set address of Column-Id to firstColumn
set address of Column-Name to secondColumn
display Column-id "|" Column-Name
goback.
Entry-Termination.
到底什么“不起作用”?您使用什么编译器和环境?顺便说一句:第二个示例不起作用,因为
sq3dll
不是有效的条目。嗨,西蒙,我刚刚更改了问题,以显示我如何尝试插入一行。我还更改了sq3 dll。我正在使用NetExpress。谢谢。我明白了,现在好多了。入口点仍然无效,因为它在程序中不存在。根据链接的C教程,这个条目在出现错误时会被调用,并带有一条描述性消息,因此我建议从链接的帖子中删除必要的部分,编译并运行程序,并提供您看到的输出。我还包括了“sqlite3.dll”入口点,我不知道这是否是您所说的入口点。我还包括了输出。对于条目,请查看您已经使用…链接了条目“yourname”的帖子。请将新的输出直接作为文本发布,因为这有更多帮助(您可以在命令窗口中选择文本并使用关联菜单->复制)。您可以对所有通话使用相同的条目,只需在实际的
CALL`之前设置一个标志(或类似于MOVE'SELECT1'TO stuff TO do的文本),就可以选择EVALUATE和/或DISPLAY
了。到底什么“不起作用”?您使用什么编译器和环境?顺便说一句:第二个示例不起作用,因为sq3dll
不是有效的条目。嗨,西蒙,我刚刚更改了问题,以显示我如何尝试插入一行。我还更改了sq3 dll。我正在使用NetExpress。谢谢。我明白了,现在好多了。入口点仍然无效,因为它在程序中不存在。根据链接的C教程,这个条目在出现错误时会被调用,并带有一条描述性消息,因此我建议从链接的帖子中删除必要的部分,编译并运行程序,并提供您看到的输出。我还包括了“sqlite3.dll”入口点,我不知道这是否是您所说的入口点。我还包括了输出。对于条目,请查看您已经使用…链接了条目“yourname”的帖子。请将新的输出直接作为文本发布,因为这有更多帮助(您可以在命令窗口中选择文本并使用关联菜单->复制)。您可以对所有通话使用相同的条目,只需在实际的
CALL`之前设置一个标志(或类似于MOVE'SELECT1'的文本)即可`让您选择评估和/或显示它。