2008-09-17 2 views
1

Ich versuche SQLBindParameter zu verwenden, um meinen Treiber für die Eingabe über SQLPutData vorzubereiten. Das Feld in der Datenbank ist ein TEXT Feld. Meine Funktion basiert auf dem folgenden MS-Beispiel: http://msdn.microsoft.com/en-us/library/ms713824(VS.85).aspx.SQLBindParameter zur Vorbereitung für SQLPutData mit C++ und SQL Native Client

Ich habe die Umgebungskonfiguration, machte die Verbindung, und bereitete meine Anweisung erfolgreich, aber wenn ich SQLBindParam nennen (mit Code unten) ist es nicht konsequent Berichterstattung: [Microsoft][SQL Native Client]Invalid precision value

int col_num = 1; 
SQLINTEGER length = very_long_string.length(); 
retcode = SQLBindParameter(StatementHandle, 
      col_num, 
      SQL_PARAM_INPUT, 
      SQL_C_BINARY, 
      SQL_LONGVARBINARY, 
      NULL, 
      NULL,    
      (SQLPOINTER) col_num,  
      NULL,     
      &length); 

Die oben auf den Fahrer verlässt sich in Verwenden Sie für den SQL_NEED_LONG_DATA_LEN Informationstyp in SQLGetInfo zurückgeben "N". Mein Fahrer gibt "Y" zurück. Wie binde ich, damit ich SQLPutData verwenden kann?

+0

Das MSDN Beispiel jedes Mal bricht, ich havnt Mine noch bekommen :(arbeiten - – NTDLS

Antwort

2

Obwohl es nicht nur sieht, wie die Beispiel-Code in der Dokumentation, fand ich die folgende Lösung für arbeiten, was ich zu tun versuchen. Danke, gbjbaanb, dass ich meine Eingabekombinationen erneut nach SQLBindParameter testen lasse.

SQLINTEGER length; 
    RETCODE retcode = SQLBindParameter(StatementHandle, 
     col_num,  // position of the parameter in the query 
     SQL_PARAM_INPUT, 
     SQL_C_CHAR, 
     SQL_VARCHAR, 
     data_length,  // size of our data 
     NULL,    // decimal precision: not used our data types 
     &my_string,   // SQLParamData will return this value later to indicate what data it's looking for so let's pass in the address of our std::string 
     data_length, 
     &length);   // it needs a length buffer 

    // length in the following operation must still exist when SQLExecDirect or SQLExecute is called 
    // in my code, I used a pointer on the heap for this. 
    length = SQL_LEN_DATA_AT_EXEC(data_length); 

Nachdem eine Anweisung ausgeführt wird, können Sie SQLParamData verwenden, um zu bestimmen, welche Daten SQL will, dass Sie es senden, wie folgt:

std::string* my_string; 
    // set string pointer to value given to SQLBindParameter 
    retcode = SQLParamData(StatementHandle, (SQLPOINTER*) &my_string); 

Schließlich verwenden SQLPutData den Inhalt Ihrer Zeichenfolge zu SQL senden :

// send data in chunks until everything is sent 
    SQLINTEGER len; 
    for (int i(0); i < my_string->length(); i += CHUNK_SIZE) 
    { 
     std::string substr = my_string->substr(i, CHUNK_SIZE); 

     len = substr.length(); 

     retcode = SQLPutData(StatementHandle, (SQLPOINTER) substr.c_str(), len); 
    } 
+0

+1 für den Kommentar „Länge in der folgenden Operation muss noch existieren, wenn SQLExecDirect oder SQLE xecute heißt ". Da ODBC zu optimieren scheint, indem die Ergebnisse von Bindungs- und Ausführungsaufrufen zusammen gesendet werden, sind auf dem Weg einige Bereichsfehler aufgetreten. – rstackhouse

Verwandte Themen