大佬教程收集整理的这篇文章主要介绍了sqlite3 – 如何在COBOL中编写SQLite回调,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我一直关注this guide,他们的解决方案正是我在COBol应用程序中所需要的.我已成功设法创建,连接,插入数据和关闭数据库,但当我尝试从数据库中选择数据时出现问题.
在本教程中,他们使用带有双指针的回调.
static int callBACk(void *NotUsed,int argc,char **argv,char **azColName){ int i; for(i=0; i<argc; i++){ printf("%s = %s\n",azColName[i],argv[i] ? argv[i] : "NulL"); } printf("\n"); return 0; }
我在COBol中的解决方案如下
WORKING-STORAGE SECTION. *----------------------------------------------------------------* 01 sqlite3-db pointer. 01 err_msg pointer. 01 sqlite pointer. 01 res pointer. 01 notused pointer. 01 argc pic 99 comp-5. 01 argv pointer. 01 azColName pointer. 01 Writefunction-Ptr procedure-pointer. procedure division. set Writefunction-Ptr to entry "sqlite-callBACk". *>Random code. 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 *>Random code. stop run. entry "sqlite-callBACk" using by value notused by value argc by reference argv by reference azColName. display argc goBACk. Entry-Termination.
回调有效,因为它被称为从数据库返回的行数,而整数argc包含表包含的列数.
问题是:
COBol中的双指针,它们是如何表示的?在我的解决方案中,我声明了一个指针,并在指针上使用“by reference”调用回调.不知道这是否是在COBol中表示双指针的正确方法?
如何显示azColName和argv的内容,而不仅仅是指针指向的内存地址?
我现在试图使用SET ADDRESS OF,但我仍然没有让它工作.一定是我错过的东西.我此刻的解决方案如下:
WORKING-STORAGE SECTION. 01 argv pointer. linkage Section. 01 link-area pic x. procedure division using link-area. *> RANDOM CODE set address of link-area to argv call "sqlite3_exec" using by value sqlite3-db by reference z"SELECT * FROM Cars" by value Writefunction-Ptr by value 0 by reference err_msg returning rc end-call *> RANDOM CODE entry "sqlite-callBACk" using by value notused by value argc by reference argv by reference azColName. display argc. if address of link-area not = null display "Contents of new argv: " link-area else display "empty" end-if goBACk. Entry-Termination.
我得到的结果是if语句总是false,因此显示字符串“empty”.但仍然将argc设置为表中的列数.
工作方案:
WORKING-STORAGE SECTION. 01 argv. 03 firstcolumn pointer. 03 secondcolumn pointer. 03 thirdcolumn pointer. 01 azColName pointer. 01 argc pic 99 comp-5. 01 notused pointer. 01 Writefunction-Ptr procedure-pointer. *----------------------------------------------------------------- linkage Section. 01 Cars_ID pic 9(2). 01 Cars_name pic X(20). 01 Cars_Price pic 9(10). /----------------------------------------------------------------- procedure division. //code set Writefunction-Ptr to entry "sqlite-callBACk". initialize sqlquery move z"SELECT * FROM Cars;" 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 //code stop run. entry "sqlite-callBACk" using by value notused by value argc by reference argv by reference azColName. set address of Cars_ID to firstcolumn set address of Cars_name to secondcolumn set address of Cars_Price to thirdcolumn display Cars_ID "|" Cars_name "|" Cars_Price goBACk. Entry-Termination.
您的SET语句位于错误的位置.调用ENTRY时,argv只有一个地址.在调用条目之前,它将是二进制零或一些不可预测的垃圾.
如果将SET移动到ENTRY之后,则应该能够使用link-AREA的值. argv仍然只是一个地址,但是link-AREA(请给它一个更好的名字)将指向该地址,因此将其定义为应定义的argv,然后link-AREA可用于获取实际内容argv.
使用BY REFERENCE时,编译器会生成代码以传递带有数据项地址的指针.
关于程序划分使用或输入使用该项目也应该是参考,编译器生成代码以将您的linkAGE SECTION定义映射到传递的地址.
如果使用BY CONTENT,则类似,但编译器会在程序中获取数据的副本,并传递引用该数据的指针.关于使用仍然定义为参考的程序划分或入口.
使用BY VALUE,编译器会“传递”实际值,尽管存在限制,无论是标准中指定的限制还是标准扩展与实际编译器.程序部门或入口的使用也应指定BY VALUE.
在所有USING上,传播BY REFERENCE / CONTENT / VALUE,如果所有都相同并且您想要BY REFERENCE,则根本不需要指定BY,它是默认值.
如果您“传递”一个指针(使用指针),那么您可以使用SET ADDRESS OF访问指向的数据. SET ADDRESS OF项目必须位于linkAGE SECTION中.
您还可以使用SET ADDRESS OF的隐式指针.对地址的设置地址b将把linkAGE SECTION中映射的地址更改为b的地址,b是在程序的DATA divISION(除文件部分以外的任何部分)的某处定义的项目.
如果要查看POINTER指向的数据,请定义具有正确大小和类型的项目,并使用SET ADDRESS OF item TO pointer-name.
POINTER当然可以指向一个简单的数据项或一个组数据项(一个结构).
linkAGE SECTION中的所有项目在引用之前必须具有地址.那些处于USING状态的编译器具有可寻址性(并且编译器假定传递了正确数量的地址/项).所有其他linkAGE SECTION项目必须具有SET ADDRESS OF建立的可寻址性,或者在使用CALL时通过ADDRESS OF并让CALLed程序设置地址.
以上是大佬教程为你收集整理的sqlite3 – 如何在COBOL中编写SQLite回调全部内容,希望文章能够帮你解决sqlite3 – 如何在COBOL中编写SQLite回调所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。