,保监处违约); printf(“结果10:%d\n”,rc); rc=OCIStmtFetch(p_sql,p_err,1,0,OCI_DEFAULT); printf(“结果11:%d\n”,rc); //读取数据 unsigned long size_left=文件大小; while(rc==OCI\u需要\u数据) { void*hndlp; ub4型; ub1输入输出; ub4国际热核实验堆; ub4-idx; ub1块; ub4-阿伦; rc=OCIStmtGetPieceInfo(p_-sql、p_-err和hndlp、&type、&in_-out、&iter、&idx和&piece); printf(“结果12a%d、%d、%d、%d、%d、%d”、(int)rc、(int)type、(int)in_out、(int)iter、(int)idx、(int)piece); alen=sizeof(缓冲区); memset(buffer,0xDA,sizeof(buffer));//一些任意数据。。。。。 rc=OCIStmtSetPieceInfo(hndlp,type,p_err,buffer,&alen,piece,NULL,NULL); printf(“结果12b%d,%d\n”,(int)rc,(int)alen); rc=OCIStmtFetch(p_sql,p_err,1,OCI_DEFAULT,OCI_DEFAULT); printf(“结果12c:%d\n”,rc); //我们可以用这里的缓冲区 长nr_read=(size_left
我自己想出来的: 首先,调用,保监处违约); printf(“结果10:%d\n”,rc); rc=OCIStmtFetch(p_sql,p_err,1,0,OCI_DEFAULT); printf(“结果11:%d\n”,rc); //读取数据 unsigned long size_left=文件大小; while(rc==OCI\u需要\u数据) { void*hndlp; ub4型; ub1输入输出; ub4国际热核实验堆; ub4-idx; ub1块; ub4-阿伦; rc=OCIStmtGetPieceInfo(p_-sql、p_-err和hndlp、&type、&in_-out、&iter、&idx和&piece); printf(“结果12a%d、%d、%d、%d、%d、%d”、(int)rc、(int)type、(int)in_out、(int)iter、(int)idx、(int)piece); alen=sizeof(缓冲区); memset(buffer,0xDA,sizeof(buffer));//一些任意数据。。。。。 rc=OCIStmtSetPieceInfo(hndlp,type,p_err,buffer,&alen,piece,NULL,NULL); printf(“结果12b%d,%d\n”,(int)rc,(int)alen); rc=OCIStmtFetch(p_sql,p_err,1,OCI_DEFAULT,OCI_DEFAULT); printf(“结果12c:%d\n”,rc); //我们可以用这里的缓冲区 长nr_read=(size_left,c,fetch,oracle-call-interface,raw,C,Fetch,Oracle Call Interface,Raw,我自己想出来的: 首先,调用ocisttexecute中的参数iters必须设置为0 这避免了崩溃,但并不能解决整个问题 此外,调用OCIDefineByPos中的参数值_sz必须设置为正在读取的列的实际大小 最后,作为OCIStmtSetPieceInfo的第四个参数传递的缓冲区只能在连续调用OCIStmtFetch后读取 这将产生以下代码: #include <stdio.h> #include <stdlib.h> #include <string.h>
ocisttexecute
中的参数iters必须设置为0
这避免了崩溃,但并不能解决整个问题 此外,调用
OCIDefineByPos
中的参数值_sz必须设置为正在读取的列的实际大小
最后,作为OCIStmtSetPieceInfo
的第四个参数传递的缓冲区只能在连续调用OCIStmtFetch
后读取
这将产生以下代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <oci.h>
static const char uid[] = "XXXX";
static const char pswd[] = "XXXX";
static const char conn[] = "XXXX";
static const char fileid[] = "XXXX";
int main(int argc, char argv[])
{
OCIEnv* p_env;
OCIError* p_err;
OCISvcCtx* p_svc;
OCIStmt* p_sql;
OCIDefine* p_dfn;
OCIBind* p_bnd;
int rc;
char stmt[256];
unsigned char buffer[8192];
int counter;
long filesize;
// Connect to DB
rc = OCIInitialize(OCI_DEFAULT, NULL, (dvoid* (*)(dvoid*, size_t))NULL, (dvoid* (*)(dvoid*, dvoid*, size_t))NULL, (void (*)(dvoid*, dvoid*))NULL);
printf("RESULT 1: %d\n", rc);
rc = OCIEnvInit(&p_env, OCI_DEFAULT, 0, NULL);
printf("RESULT 2: %d\n", rc);
rc = OCIHandleAlloc(p_env, (void**)&p_err, OCI_HTYPE_ERROR, 0, NULL);
printf("RESULT 3: %d\n", rc);
rc = OCIHandleAlloc(p_env, (void**)&p_svc, OCI_HTYPE_SVCCTX, 0, NULL);
printf("RESULT 4: %d\n", rc);
rc = OCILogon(p_env, p_err, &p_svc, (text*)uid, (ub4)strlen(uid), (text*)pswd, (ub4)strlen(pswd), (text*)conn, (ub4)strlen(conn));
printf("RESULT 5: %d\n", rc);
// Determine size of data
rc = OCIHandleAlloc(p_env, (void**)&p_sql, OCI_HTYPE_STMT, 0, NULL);
printf("RESULT 6: %d\n", rc);
sprintf(stmt, "SELECT filesize FROM td_planimetrie WHERE id_file = :x");
rc = OCIStmtPrepare(p_sql, p_err, (text*)stmt, (ub4)strlen(stmt), OCI_NTV_SYNTAX, OCI_DEFAULT);
printf("RESULT 6a: %d\n", rc);
rc = OCIBindByName(p_sql, &p_bnd, p_err, (text*)":x", -1, (text*)fileid, (sb4)strlen(fileid) + 1, SQLT_STR, NULL, NULL, NULL, 0, NULL, OCI_DEFAULT);
printf("RESULT 6b: %d\n", rc);
rc = OCIDefineByPos(p_sql, &p_dfn, p_err, 1, &filesize, sizeof(filesize), SQLT_INT, NULL, NULL, NULL, OCI_DEFAULT);
printf("RESULT 6c: %d\n", rc);
rc = OCIStmtExecute(p_svc, p_sql, p_err, 1, 0, NULL, NULL, OCI_DEFAULT);
printf("RESULT 6d: %d %ld\n", rc, filesize);
rc = OCIHandleFree(p_sql, OCI_HTYPE_STMT);
printf("RESULT 6d: %d\n", rc);
// Prepare reading data
rc = OCIHandleAlloc(p_env, (void**)&p_sql, OCI_HTYPE_STMT, 0, NULL);
printf("RESULT 7: %d\n", rc);
sprintf(stmt, "SELECT content FROM td_planimetrie WHERE id_file = :x");
rc = OCIStmtPrepare(p_sql, p_err, (text*)stmt, (ub4)strlen(stmt), OCI_NTV_SYNTAX, OCI_DEFAULT);
printf("RESULT 7a: %d\n", rc);
rc = OCIBindByName(p_sql, &p_bnd, p_err, (text*)":x", -1, (text*)fileid, (sb4)strlen(fileid) + 1, SQLT_STR, NULL, NULL, NULL, 0, NULL, OCI_DEFAULT);
printf("RESULT 8: %d\n", rc);
rc = OCIDefineByPos(p_sql, &p_dfn, p_err, 1, NULL, filesize, SQLT_LBI, NULL, NULL, NULL, OCI_DYNAMIC_FETCH);
printf("RESULT 9: %d\n", rc);
rc = OCIStmtExecute(p_svc, p_sql, p_err, 0, 0, NULL, NULL, OCI_DEFAULT);
printf("RESULT 10: %d\n", rc);
rc = OCIStmtFetch(p_sql, p_err, 1, 0, OCI_DEFAULT);
printf("RESULT 11: %d\n", rc);
// Read data
unsigned long size_left = filesize;
while (rc == OCI_NEED_DATA)
{
void* hndlp;
ub4 type;
ub1 in_out;
ub4 iter;
ub4 idx;
ub1 piece;
ub4 alen;
rc = OCIStmtGetPieceInfo(p_sql, p_err, &hndlp, &type, &in_out, &iter, &idx, &piece);
printf("RESULT 12a %d, %d, %d, %d, %d, %d\n", (int)rc, (int)type, (int)in_out, (int)iter, (int)idx, (int)piece);
alen = sizeof(buffer);
memset(buffer, 0xDA, sizeof(buffer)); // some arbitrary data .....
rc = OCIStmtSetPieceInfo(hndlp, type, p_err, buffer, &alen, piece, NULL, NULL);
printf("RESULT 12b %d, %d\n", (int)rc, (int)alen);
rc = OCIStmtFetch(p_sql, p_err, 1, OCI_DEFAULT, OCI_DEFAULT);
printf("RESULT 12c: %d\n", rc);
// We can use the buffer over here
long nr_read = (size_left < alen) ? size_left : alen;
// save 'nr_read' bytes within the buffer
size_left -= nr_read;
}
printf("Size left: %lu\n", size_left);
// Cleaning up...
rc = OCILogoff(p_svc, p_err);
rc = OCIHandleFree(p_sql, OCI_HTYPE_STMT);
rc = OCIHandleFree(p_svc, OCI_HTYPE_SVCCTX);
rc = OCIHandleFree(p_err, OCI_HTYPE_ERROR);
return (0);
} // main
#包括
#包括
#包括
#包括
静态常量字符uid[]=“XXXX”;
静态常量字符pswd[]=“XXXX”;
静态常量字符连接[]=“XXXX”;
静态常量字符文件ID[]=“XXXX”;
int main(int argc,char argv[]
{
OCIEnv*p_env;
OCIError*p_err;
OCISVCTX*p_svc;
OCISMT*p_sql;
OCIDefine*p_dfn;
OCIBind*p_bnd;
int rc;
字符stmt[256];
无符号字符缓冲区[8192];
整数计数器;
长文件大小;
//连接到数据库
rc=OCIInitialize(OCI_默认值,NULL,(dvoid*(*)(dvoid*,size_t))NULL,(dvoid*(*)(dvoid*,dvoid*,size_t))NULL,(void(*)(dvoid*,dvoid*))NULL);
printf(“结果1:%d\n”,rc);
rc=OCIEnvInit(&p_env,OCI_DEFAULT,0,NULL);
printf(“结果2:%d\n”,rc);
rc=OCIHandleAlloc(p_env,(void**)和p_err,OCI_HTYPE_ERROR,0,NULL);
printf(“结果3:%d\n”,rc);
rc=OCIHandleAlloc(p_env,(void**)和p_svc,OCI_HTYPE_SVCCTX,0,NULL);
printf(“结果4:%d\n”,rc);
rc=OCILogon(p_env,p_err,&p_svc,(text*)uid,(ub4)strlen(uid),(text*)pswd,(ub4)strlen(pswd),(text*)conn,(ub4)strlen(conn));
printf(“结果5:%d\n”,rc);
//确定数据的大小
rc=OCIHandleAlloc(p_env,(void**)和p_sql,OCI_HTYPE_STMT,0,NULL);
printf(“结果6:%d\n”,rc);
sprintf(stmt,“从td_planimerie中选择文件大小,其中id_file=:x”);
rc=OCIStmtPrepare(p_sql,p_err,(text*)stmt,(ub4)strlen(stmt),OCI_NTV_语法,OCI_默认值);
printf(“结果6a:%d\n”,rc);
rc=OCIBindByName(p_sql,&p_bnd,p_err,(text*)“:x”,-1,(text*)fileid,(sb4)strlen(fileid)+1,SQLT_STR,NULL,NULL,NULL,0,NULL,OCI_默认值);
printf(“结果6b:%d\n”,rc);
rc=OCIDefineByPos(p_sql,&p_dfn,p_err,1,&filesize,sizeof(filesize),SQLT_INT,NULL,NULL,NULL,OCI_默认值);
printf(“结果6c:%d\n”,rc);
rc=ocistTextExecute(p_svc、p_sql、p_err、1、0、NULL、NULL、OCI_DEFAULT);
printf(“结果6d:%d%ld\n”,rc,文件大小);
rc=OCIHandleFree(p_sql,OCI_HTYPE_STMT);
printf(“结果6d:%d\n”,rc);
//准备读取数据
rc=OCIHandleAlloc(p_env,(void**)和p_sql,OCI_HTYPE_STMT,0,NULL);
printf(“结果7:%d\n”,rc);
sprintf(stmt,“从td_平面图中选择内容,其中id_文件=:x”);
rc=OCIStmtPrepare(p_sql,p_err,(text*)stmt,(ub4)strlen(stmt),OCI_NTV_语法,OCI_默认值);
printf(“结果7a:%d\n”,rc);
rc=OCIBindByName(p_sql,&p_bnd,p_err,(text*)“:x”,-1,(text*)fileid,(sb4)strlen(fileid)+1,SQLT_STR,NULL,NULL,NULL,0,NULL,OCI_默认值);
printf(“结果8:%d\n”,rc);
rc=OCIDefineByPos(p_-sql,&p_-dfn,p_-err,1,NULL,filesize,SQLT_-LBI,NULL,NULL,NULL,OCI_-DYNAMIC_-FETCH);
printf(“结果9:%d\n”,rc);
rc=ocistTextExecute(p_svc、p_sql、p_err、0、NULL、NULL、OCI_DEFAULT);
printf(“结果10:%d\n”,rc);
rc=OCIStmtFetch(p_sql,p_err,1,0,OCI_DEFAULT);
printf(“结果11:%d\n”,rc);
//读取数据
unsigned long size_left=文件大小;
while(rc==OCI\u需要\u数据)
{
void*hndlp;
ub4型;
ub1输入输出;
ub4国际热核实验堆;
ub4-idx;
ub1块;
ub4-阿伦;
rc=OCIStmtGetPieceInfo(p_-sql、p_-err和hndlp、&type、&in_-out、&iter、&idx和&piece);
printf(“结果12a%d、%d、%d、%d、%d、%d”、(int)rc、(int)type、(int)in_out、(int)iter、(int)idx、(int)piece);
alen=sizeof(缓冲区);
memset(buffer,0xDA,sizeof(buffer));//一些任意数据。。。。。
rc=OCIStmtSetPieceInfo(hndlp,type,p_err,buffer,&alen,piece,NULL,NULL);
printf(“结果12b%d,%d\n”,(int)rc,(int)alen);
rc=OCIStmtFetch(p_sql,p_err,1,OCI_DEFAULT,OCI_DEFAULT);
printf(“结果12c:%d\n”,rc);
//我们可以用这里的缓冲区
长nr_read=(size_left#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <oci.h>
static const char uid[] = "XXXX";
static const char pswd[] = "XXXX";
static const char conn[] = "XXXX";
static const char fileid[] = "XXXX";
int main(int argc, char argv[])
{
OCIEnv* p_env;
OCIError* p_err;
OCISvcCtx* p_svc;
OCIStmt* p_sql;
OCIDefine* p_dfn;
OCIBind* p_bnd;
int rc;
char stmt[256];
unsigned char buffer[8192];
int counter;
long filesize;
// Connect to DB
rc = OCIInitialize(OCI_DEFAULT, NULL, (dvoid* (*)(dvoid*, size_t))NULL, (dvoid* (*)(dvoid*, dvoid*, size_t))NULL, (void (*)(dvoid*, dvoid*))NULL);
printf("RESULT 1: %d\n", rc);
rc = OCIEnvInit(&p_env, OCI_DEFAULT, 0, NULL);
printf("RESULT 2: %d\n", rc);
rc = OCIHandleAlloc(p_env, (void**)&p_err, OCI_HTYPE_ERROR, 0, NULL);
printf("RESULT 3: %d\n", rc);
rc = OCIHandleAlloc(p_env, (void**)&p_svc, OCI_HTYPE_SVCCTX, 0, NULL);
printf("RESULT 4: %d\n", rc);
rc = OCILogon(p_env, p_err, &p_svc, (text*)uid, (ub4)strlen(uid), (text*)pswd, (ub4)strlen(pswd), (text*)conn, (ub4)strlen(conn));
printf("RESULT 5: %d\n", rc);
// Determine size of data
rc = OCIHandleAlloc(p_env, (void**)&p_sql, OCI_HTYPE_STMT, 0, NULL);
printf("RESULT 6: %d\n", rc);
sprintf(stmt, "SELECT filesize FROM td_planimetrie WHERE id_file = :x");
rc = OCIStmtPrepare(p_sql, p_err, (text*)stmt, (ub4)strlen(stmt), OCI_NTV_SYNTAX, OCI_DEFAULT);
printf("RESULT 6a: %d\n", rc);
rc = OCIBindByName(p_sql, &p_bnd, p_err, (text*)":x", -1, (text*)fileid, (sb4)strlen(fileid) + 1, SQLT_STR, NULL, NULL, NULL, 0, NULL, OCI_DEFAULT);
printf("RESULT 6b: %d\n", rc);
rc = OCIDefineByPos(p_sql, &p_dfn, p_err, 1, &filesize, sizeof(filesize), SQLT_INT, NULL, NULL, NULL, OCI_DEFAULT);
printf("RESULT 6c: %d\n", rc);
rc = OCIStmtExecute(p_svc, p_sql, p_err, 1, 0, NULL, NULL, OCI_DEFAULT);
printf("RESULT 6d: %d %ld\n", rc, filesize);
rc = OCIHandleFree(p_sql, OCI_HTYPE_STMT);
printf("RESULT 6d: %d\n", rc);
// Prepare reading data
rc = OCIHandleAlloc(p_env, (void**)&p_sql, OCI_HTYPE_STMT, 0, NULL);
printf("RESULT 7: %d\n", rc);
sprintf(stmt, "SELECT content FROM td_planimetrie WHERE id_file = :x");
rc = OCIStmtPrepare(p_sql, p_err, (text*)stmt, (ub4)strlen(stmt), OCI_NTV_SYNTAX, OCI_DEFAULT);
printf("RESULT 7a: %d\n", rc);
rc = OCIBindByName(p_sql, &p_bnd, p_err, (text*)":x", -1, (text*)fileid, (sb4)strlen(fileid) + 1, SQLT_STR, NULL, NULL, NULL, 0, NULL, OCI_DEFAULT);
printf("RESULT 8: %d\n", rc);
rc = OCIDefineByPos(p_sql, &p_dfn, p_err, 1, NULL, filesize, SQLT_LBI, NULL, NULL, NULL, OCI_DYNAMIC_FETCH);
printf("RESULT 9: %d\n", rc);
rc = OCIStmtExecute(p_svc, p_sql, p_err, 0, 0, NULL, NULL, OCI_DEFAULT);
printf("RESULT 10: %d\n", rc);
rc = OCIStmtFetch(p_sql, p_err, 1, 0, OCI_DEFAULT);
printf("RESULT 11: %d\n", rc);
// Read data
unsigned long size_left = filesize;
while (rc == OCI_NEED_DATA)
{
void* hndlp;
ub4 type;
ub1 in_out;
ub4 iter;
ub4 idx;
ub1 piece;
ub4 alen;
rc = OCIStmtGetPieceInfo(p_sql, p_err, &hndlp, &type, &in_out, &iter, &idx, &piece);
printf("RESULT 12a %d, %d, %d, %d, %d, %d\n", (int)rc, (int)type, (int)in_out, (int)iter, (int)idx, (int)piece);
alen = sizeof(buffer);
memset(buffer, 0xDA, sizeof(buffer)); // some arbitrary data .....
rc = OCIStmtSetPieceInfo(hndlp, type, p_err, buffer, &alen, piece, NULL, NULL);
printf("RESULT 12b %d, %d\n", (int)rc, (int)alen);
rc = OCIStmtFetch(p_sql, p_err, 1, OCI_DEFAULT, OCI_DEFAULT);
printf("RESULT 12c: %d\n", rc);
// We can use the buffer over here
long nr_read = (size_left < alen) ? size_left : alen;
// save 'nr_read' bytes within the buffer
size_left -= nr_read;
}
printf("Size left: %lu\n", size_left);
// Cleaning up...
rc = OCILogoff(p_svc, p_err);
rc = OCIHandleFree(p_sql, OCI_HTYPE_STMT);
rc = OCIHandleFree(p_svc, OCI_HTYPE_SVCCTX);
rc = OCIHandleFree(p_err, OCI_HTYPE_ERROR);
return (0);
} // main