Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
,保监处违约); 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 - Fatal编程技术网

,保监处违约); 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