2016-06-08 15 views
0

Ich versuche, einen NULL-Wert an einen Parameter in einer SQL-Abfrage zu binden, aber ich bekomme immer einen Fehler HY009 ungültiger Argumentwert, wenn ich die Anweisung ausführen. Dieses seltsame Verhalten erscheint nur, wenn ich im Freigabemodus baue. Im Debug-Modus funktioniert es gut. Irgendwelche Ideen?SQLBindParam: Einstellung Nullwert schlägt fehl (ODBC)

Mein Code:

SQLRETURN nRet = SQLPrepare(m_hStmt, (SQLTCHAR *)strSQL, SQL_NTS); // returns SQL_SUCCESS 
SQLINTEGER cbNumeric = SQL_NULL_DATA; 
nRet = SQLBindParameter(m_hStmt, 
       parameterIndex,  
       SQL_PARAM_INPUT,  
       SQL_C_CHAR,   
       SQL_LONGVARCHAR,  
       0,     
       NULL,    
       NULL,  
       0,     
       &cbNumeric); // returns SQL_SUCCESS 
nRet = SQLExecute(m_hStmt); // returns SQL_NEED_DATA 
nRet = _SQLParamDataPutData(nRet); // returns Debug: SQL_SUCCESS, Release: SQL_ERROR  

Antwort

0

Wenn ich die Dokumentation bei https://msdn.microsoft.com/en-us/library/ms710963%28v=vs.85%29.aspx richtig verstehe, sind Sie nicht berechtigt, einen NULL-Zeiger als ParameterValuePtr Argument übergeben - selbst wenn der Wert ein NULL-Wert ist.

Aus den Kommentaren im doc, über den Fehler HY009:

(DM) Das Argument ParameterValuePtr ein Nullzeiger war, das Argument StrLen_or_IndPtr war ein Null-Zeiger, und das Argument InputOutputType nicht war SQL_PARAM_OUTPUT.

Funktioniert es, wenn Sie Ihren Code so etwas wie dies ändern:

SQLRETURN nRet = SQLPrepare(m_hStmt, (SQLTCHAR *)strSQL, SQL_NTS); 
SQLCHAR dummy[1]; 
dummy[0] = '\0'; 
SQLINTEGER cbNumeric = SQL_NULL_DATA; 
nRet = SQLBindParameter(m_hStmt, 
       parameterIndex,  
       SQL_PARAM_INPUT,  
       SQL_C_CHAR,   
       SQL_LONGVARCHAR,  
       0,     
       NULL,    
       dummy,  
       SQL_NTS,     
       &cbNumeric); // returns SQL_SUCCESS 
nRet = SQLExecute(m_hStmt); // returns SQL_NEED_DATA 
nRet = _SQLParamDataPutData(nRet);