为什么更新不会更新任何记录?

时间:2018-03-02 15:21:44

标签: sql oracle oci

我正在使用OCI函数来更新Oracle中的数据库表,但是尽管命令都返回成功,但数据库表中的任何内容都没有变化。如果我硬编码Where子句值,它会改变,所以我想我可能在绑定代码中做错了什么?

如果我按如下方式创建数据库表:

create table updatebuddTI(i char(10), j int);
insert into updatebuddTI values ('test1',1);
insert into updatebuddTI values ('test2',2);
insert into updatebuddTI values ('test3',3);

然后使用代码:

#include "stdafx.h"
#include <string>
#include <oci.h>
#include <stdlib.h>
#define OCI_NOT_NULL 0
#define OCI_VALUE_NULL -1
#define OCI_VALUE_TRUNCATED -2
#define ORACLE_MAX_SESSIONS 30

int _tmain(int argc, _TCHAR* argv[]) {
    // OCI handles
    OCIEnv *envhp;
    OCIError *errhp;
    OCIServer *srvhp;
    OCISvcCtx *svchp;
    OCISession *authp;
    OCIStmt *stmtp;
    OCIDefine *defnpp;

    // Connection information
    text* user = (text*)"test";
    text* pwd = (text*)"password";
    text* sid = (text*)"oracle-server";


    char *query = "UPDATE updatebuddTI SET I = 'test3' WHERE J = :1";// :2";

    int dataReceivedI[10];
    // Fetched data indicators, lengths and codes
    ub2 dataReceived_len[10];
    ub2 dataReceived_code[10];

    sb2 dataReceived_indI[3];
    ub2 dataReceived_lenI[3];
    ub2 dataReceived_codeI[3];

    oratext message[512];
    sb4 errcode;


    // Allocate environment
    int rc = OCIEnvCreate(&envhp, OCI_DEFAULT, NULL, NULL, NULL, NULL, 0, NULL);


    ub2 code = OCINlsCharSetNameToId(envhp, (const oratext  *)"WE8MSWIN1252");
        OCIEnv *envHandle(0);
        if(code) {
            rc = OCIEnvNlsCreate(&envHandle,
                        OCI_OBJECT | OCI_THREADED,
                        NULL,
                        NULL,
                        NULL,
                        NULL,
                        0,
                        NULL,
                        code,
                        code);
        } else {
            printf("problem with OCIEnvNlsCreate!\n");
        }

    // Allocate error handle
    rc = OCIHandleAlloc(envhp, (void**)&errhp, OCI_HTYPE_ERROR, 0, NULL);

    // Allocate server and service context handles
    rc = OCIHandleAlloc(envhp, (void**)&srvhp, OCI_HTYPE_SERVER, 0, NULL);
    rc = OCIHandleAlloc(envhp, (void**)&svchp, OCI_HTYPE_SVCCTX, 0, NULL);

    // Attach to the server
    //rc = OCIServerAttach(srvhp, errhp, sid, strlen((char*)sid), 0);

    // Set server in the service context 
    rc = OCIAttrSet(svchp, OCI_HTYPE_SVCCTX, (dvoid*)srvhp, 0, OCI_ATTR_SERVER, errhp);

    // Allocate session handle
    rc = OCIHandleAlloc(envhp, (void**)&authp, OCI_HTYPE_SESSION, 0, NULL);

    // Set user name and password
    rc = OCIAttrSet(authp, OCI_HTYPE_SESSION, (void*)user, strlen((char*)user),
        OCI_ATTR_USERNAME, errhp);
    rc = OCIAttrSet(authp, OCI_HTYPE_SESSION, (void*)pwd, strlen((char *)pwd),
        OCI_ATTR_PASSWORD, errhp);

    std::string path("oracle-server");
    rc =  OCIServerAttach(srvhp, errhp, (text *)path.c_str(), (sb4)path.length(), 0);

    // Connect
    rc = OCISessionBegin(svchp, errhp, authp, OCI_CRED_RDBMS, OCI_DEFAULT);

    // Set session in the service context
    rc = OCIAttrSet(svchp, OCI_HTYPE_SVCCTX, authp, 0, OCI_ATTR_SESSION, errhp);

    // Allocate statement handle
    rc = OCIHandleAlloc(envhp, (void**)&stmtp, OCI_HTYPE_STMT, 0, NULL);

    // Prepare the query
    rc = OCIStmtPrepare(stmtp, errhp, (text*)query, strlen(query), OCI_NTV_SYNTAX, OCI_DEFAULT);

    char text[10];
    int option=0;

    // Define the select list items 
    rc = OCIDefineByPos(stmtp, &defnpp, errhp, 1, (void*)text, 5, SQLT_CHR, (void*)dataReceivedI,
        dataReceived_len, dataReceived_code, OCI_DEFAULT);

    if (rc != 0) {
        OCIErrorGet(errhp, (ub4)1, NULL, &errcode, message, sizeof(message), (ub4)OCI_HTYPE_ERROR);
        printf("%s", message);
    }


    rc = OCIDefineByPos(stmtp, &defnpp, errhp, 2, (void*)option, sizeof(int), SQLT_NUM, (void*)dataReceived_indI,
        dataReceived_lenI, dataReceived_codeI, OCI_DEFAULT);

    if (rc != 0) {
        OCIErrorGet(errhp, (ub4)1, NULL, &errcode, message, sizeof(message), (ub4)OCI_HTYPE_ERROR);
        printf("%s", message);
    }

    OCIBind* bindHandle2;
    rc = OCIBindByPos(stmtp, &bindHandle2, errhp, 1,
        (dvoid *)&option, (sword) sizeof(int), SQLT_NUM,
        (dvoid *)0, (ub2 *)0, (ub2 *)0, (ub4)0, (ub4 *)0, OCI_DEFAULT);

    if (rc != 0) {
        OCIErrorGet(errhp, (ub4)1, NULL, &errcode, message, sizeof(message), (ub4)OCI_HTYPE_ERROR);
        printf("%s", message);
    }

    strcpy_s(text, "test3");
    option = 2;

    rc = OCIStmtExecute(svchp, stmtp, errhp, 1, 0, 0,0, OCI_DEFAULT);

    if (rc != 0) {
        OCIErrorGet(errhp, (ub4)1, NULL, &errcode, message, sizeof(message), (ub4)OCI_HTYPE_ERROR);
        printf("%s", message);
    }

    rc = OCIHandleFree(stmtp, OCI_HTYPE_STMT);

    // Disconnect
    rc = OCISessionEnd(svchp, errhp, authp, OCI_DEFAULT);
    rc = OCIServerDetach(srvhp, errhp, OCI_DEFAULT);

    rc = OCIHandleFree(envhp, OCI_HTYPE_ENV);
}

有谁能看到我做错了什么?

0 个答案:

没有答案