Hi,
Situation: Visual Studio 2005 / C++ / fbclient_ms.lib
Ich hole von der Datenbank mit Fetch Zeile für Zeile aus der DB.
Nun möchte ich sobald ich eine Zeile bekomme die mittels Cursor bearbeiten, löschen etc.
Leider bekommen ich dann immer die meldung "Cursor xy is not updatable" Sql-Error -510.
Möglicherweise liegt der Fehler an den schreib lese rechten... aber ein "Delete From Test_1 WHERE TEST_1.VALUE_1 = 'dd'" funktioniert nur das "Delete From Test_1 WHERE CURRENT OF xy" tut net.
oh man, vielleicht könnt ihr mir Helfen?!
Weiß nicht mehr wo ich ansetzen soll!
Situation: Visual Studio 2005 / C++ / fbclient_ms.lib
Ich hole von der Datenbank mit Fetch Zeile für Zeile aus der DB.
Nun möchte ich sobald ich eine Zeile bekomme die mittels Cursor bearbeiten, löschen etc.
Leider bekommen ich dann immer die meldung "Cursor xy is not updatable" Sql-Error -510.
Möglicherweise liegt der Fehler an den schreib lese rechten... aber ein "Delete From Test_1 WHERE TEST_1.VALUE_1 = 'dd'" funktioniert nur das "Delete From Test_1 WHERE CURRENT OF xy" tut net.
Code:
isc_db_handle dbHandle = NULL; // database handle isc_tr_handle trans = NULL; // transaction handle isc_stmt_handle stmt = NULL; // statement handle ISC_STATUS_ARRAY status; // status vector XSQLDA *osqlda; char *str = "SELECT * FROM TEST_1 FOR UPDATE"; //Lösung siehe nächster Post // Allocate an output XSQLDA osqlda. osqlda = reinterpret_cast<XSQLDA*>(malloc(XSQLDA_LENGTH(1))); osqlda->version = SQLDA_VERSION1; osqlda->sqln = 1; // Open connection. if (openDbConnection(&dbHandle, status, "10.228.5.35", "/home/kohgr/Desktop/fb/t.fdb", "SYSDBA", "masterkey")){ printStatus(status, "open connection"); return 1; } /*************************************** * Transaction Parameter Buffer *******************/ static char isc_tpb_0[] = { isc_tpb_version3, /* InterBase version. */ isc_tpb_write,/* Read-write access. */ isc_tpb_lock_write, 6, 'T','E','S', 'T' ,'_', '1', isc_tpb_protected /* Don’t allow other transactions to write against this table. */ }; // Start transaction. if(isc_start_transaction(status, &trans, 1, &dbHandle, sizeof(isc_tpb_0), isc_tpb_0)){ printStatus(status, "start transaction"); return 1; } if(isc_dsql_allocate_statement(status, &dbHandle, &stmt)) { printStatus(status, "allocate statement"); return 1; } if(isc_dsql_prepare(status, &trans, &stmt, 0, str, SQL_DIALECT_V6, osqlda)) { printStatus(status, "prepare"); return 1; } // allocate XSQLVARS // ........... for (int i = 0; i < osqlda->sqld; i++) { /* allocate memory for each column */ } } // Excecute SQL-Statement if(isc_dsql_execute(status, &trans, &stmt, SQL_DIALECT_V6, NULL)) { printStatus(status, "isc_dsql_execute"); return 1; } /*********** setting up Cursor ************/ string curs = "DaCursor"; if (isc_dsql_set_cursor_name(status, &stmt, curs.c_str(), 0)) { printStatus(status, "isc_dsql_execute"); return 1; } int fetchStatus = 0; // Jeweils eine Zeile aus der Datenbank/dem cache holen while ((fetchStatus = isc_dsql_fetch(status, &stmt, SQL_DIALECT_V6, osqlda)) == 0) { // Über alle Spalten for (int i = 0; i < osqlda->sqld; i++) { // check value for NULL if (*reinterpret_cast<short*>(osqlda->sqlvar[i].sqlind) == -1) { cout << "<NULL>\t"; } else { // print value printValue(&(osqlda->sqlvar[i]), &dbHandle, &trans, status); } } cout << endl; /********************* Delete ROW With Cursor ********/ /***** ERROR -510 Cursor not updatable **************/ string cmd = "Delete From Test_1 WHERE CURRENT OF " + curs; if (isc_dsql_execute_immediate(status, &dbHandle, &trans, 0, cmd.c_str(), 1, 0)) { printStatus(status, "isc_dsql_fetch"); return(1); } }
Weiß nicht mehr wo ich ansetzen soll!
Comment