Hallo zusammen,
wir haben hier eine alte Legacy-Anwendung, sie seit Jahrzehnten den
Datenzugriff über ODBC abwickelt. Jetzt wollen wir auf SQL Server
umstellen, und ich habe hier die 2008 er Express Version installiert, nebst
Native Client 10 - eine Standardkonfiguration, ganz normal.
Allerdings laufen unsere ODBC-Anweisungen nicht mehr, und zwar speziell die
INSERTs mit Parametern - also sowas wie
INSERT INTO Table1 ( A, B ) values ( 100 , ? )
Ein probehalber direkt ausgeführtes insert, etwa wie
INSERT INTO Table1 ( A, B ) values ( 100 , 200 )
geht dagegen einwandfrei.
Als erstes natürlich Google durchgesehen, und eine Reihe von Beispielapps
angesehen - beispielsweise diese hier:
http://support.microsoft.com/kb/135715/en-us
Da gehts zwar um was anderes, aber der ODBC-Code sollte doch funktionieren,
schließlich ist er direkt von Microsoft, wenn auch schon etwas älter.
Zusammengestrichen aufs Wesentliche (ohne Fehlerbehandlung, Logging etc)
sieht es bei mir nun so aus:
SQLAllocEnv(&henv);
SQLAllocConnect( henv, &hdbc );
SQLConnect( hdbc, (uchar*)"Der-ODBC-Treiber", SQL_NTS, (uchar*)"Der-Name",
SQL_NTS, (uchar*)"Das-Passwort", SQL_NTS );
SQLAllocStmt( hdbc, &hstmt )
SQLPrepare( hstmt, (uchar*)"INSERT INTO Table1 ( A, B ) values ( 100 , ?
)", SQL_NTS );
SQLBindParameter( hstmt, 1, SQL_PARAM_INPUT, SQL_C_SHORT, SQL_SMALLINT,
0, 0, (SQLPOINTER)1, 0, &length );
length = SQL_LEN_DATA_AT_EXEC(0); // hier überflüssig ??
retcode = SQLExecute( hstmt );
while (retcode == SQL_NEED_DATA)
{
retcode = SQLParamData( hstmt, &ret_id );
if ( retcode == SQL_NEED_DATA )
{
int i = 3;
SQLPutData( hstmt, (SQLPOINTER)&i, 0 );
}
}
SQLFreeStmt( hstmt, SQL_CLOSE );
SQLDisconnect( hdbc );
SQLFreeConnect( hdbc );
SQLFreeEnv( henv );
ich denke mal, hier müsste alles richtig sein - mir fällt nichts ein, was
man ändern könnte, höchstens vielleicht die Konstanten bei
SQLBindParameter. Da habe ich aber ich mir verschiedenen Kombinationen
experimentiert, leider ohne Erfolg.
Wieseo also geht das nicht mit Native Client 10, während dieser Code früher
einwandfrei ging?
Und warum liegt das an dem variablen Parameter? Der daraus folgende
Verdächtige wäre SQLBindParameter, aber ich habe keine Ahnung, was das sein
könnte.
Hat jemand ODBC "am Laufen" mit Native Client 10?
wir haben hier eine alte Legacy-Anwendung, sie seit Jahrzehnten den
Datenzugriff über ODBC abwickelt. Jetzt wollen wir auf SQL Server
umstellen, und ich habe hier die 2008 er Express Version installiert, nebst
Native Client 10 - eine Standardkonfiguration, ganz normal.
Allerdings laufen unsere ODBC-Anweisungen nicht mehr, und zwar speziell die
INSERTs mit Parametern - also sowas wie
INSERT INTO Table1 ( A, B ) values ( 100 , ? )
Ein probehalber direkt ausgeführtes insert, etwa wie
INSERT INTO Table1 ( A, B ) values ( 100 , 200 )
geht dagegen einwandfrei.
Als erstes natürlich Google durchgesehen, und eine Reihe von Beispielapps
angesehen - beispielsweise diese hier:
http://support.microsoft.com/kb/135715/en-us
Da gehts zwar um was anderes, aber der ODBC-Code sollte doch funktionieren,
schließlich ist er direkt von Microsoft, wenn auch schon etwas älter.
Zusammengestrichen aufs Wesentliche (ohne Fehlerbehandlung, Logging etc)
sieht es bei mir nun so aus:
SQLAllocEnv(&henv);
SQLAllocConnect( henv, &hdbc );
SQLConnect( hdbc, (uchar*)"Der-ODBC-Treiber", SQL_NTS, (uchar*)"Der-Name",
SQL_NTS, (uchar*)"Das-Passwort", SQL_NTS );
SQLAllocStmt( hdbc, &hstmt )
SQLPrepare( hstmt, (uchar*)"INSERT INTO Table1 ( A, B ) values ( 100 , ?
)", SQL_NTS );
SQLBindParameter( hstmt, 1, SQL_PARAM_INPUT, SQL_C_SHORT, SQL_SMALLINT,
0, 0, (SQLPOINTER)1, 0, &length );
length = SQL_LEN_DATA_AT_EXEC(0); // hier überflüssig ??
retcode = SQLExecute( hstmt );
while (retcode == SQL_NEED_DATA)
{
retcode = SQLParamData( hstmt, &ret_id );
if ( retcode == SQL_NEED_DATA )
{
int i = 3;
SQLPutData( hstmt, (SQLPOINTER)&i, 0 );
}
}
SQLFreeStmt( hstmt, SQL_CLOSE );
SQLDisconnect( hdbc );
SQLFreeConnect( hdbc );
SQLFreeEnv( henv );
ich denke mal, hier müsste alles richtig sein - mir fällt nichts ein, was
man ändern könnte, höchstens vielleicht die Konstanten bei
SQLBindParameter. Da habe ich aber ich mir verschiedenen Kombinationen
experimentiert, leider ohne Erfolg.
Wieseo also geht das nicht mit Native Client 10, während dieser Code früher
einwandfrei ging?
Und warum liegt das an dem variablen Parameter? Der daraus folgende
Verdächtige wäre SQLBindParameter, aber ich habe keine Ahnung, was das sein
könnte.
Hat jemand ODBC "am Laufen" mit Native Client 10?