Announcement

Collapse
No announcement yet.

Cursor not updatable! SQL Error: -510

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Cursor not updatable! SQL Error: -510

    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.

    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);
    		}
    	}
    oh man, vielleicht könnt ihr mir Helfen?!

    Weiß nicht mehr wo ich ansetzen soll!
    Zuletzt editiert von caligo; 15.12.2009, 15:28.

  • #2
    Juhuu

    :cool

    hab den Fehler gefunden!

    oh man, und es war wie vermutet eine mini-winzige Kleinigkeit.

    man muss beim SQL Statement mit dem man durch die Zeilen -Fetcht noch FOR UPDATE anhängen!

    thats it!

    ich markier es noch oben im Code!

    Comment

    Working...
    X