Re: SQLBulkOperations

From: "John C(dot) Frickson" <john(at)frickson(dot)us>
To: Hiroshi Inoue <inoue(at)tpf(dot)co(dot)jp>
Cc: Michael Paquier <michael(dot)paquier(at)gmail(dot)com>, PostgreSQL ODBC List <pgsql-odbc(at)postgresql(dot)org>
Subject: Re: SQLBulkOperations
Date: 2014-06-07 06:24:14
Message-ID: 1402122254.8234.45.camel@server.frickson.pvt
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-odbc


On Sat, 2014-06-07 at 14:59 +0900, Hiroshi Inoue wrote:
> (2014/06/07 1:14), John C. Frickson wrote:
> > Ok, I boiled my code down to the following sample. The comments show
> > the errors that get printed.
> >
> > ----------8<----------8<----------8<----------8<----------8<----------8<----------
> > #include <stdio.h>
> > #include <string.h>
> > #include <sql.h>
> > #include <sqlext.h>
> >
> > void printerr(int);
> >
> > SQLHANDLE henv, hdbc, hstmt;
> >
> > int main()
> > {
> > SQLLEN length_or_ind[3];
> > char connOut[2048], colVal[3][32];
> > const char *query = "SELECT * FROM pvsystem.loginfails WHERE userid='foo'";
> > const char *cstr = "DRIVER={PSQL};SERVER=server.frickson.pvt;UID=pvwebuser;"
> > "PWD=Zjgg2WuNwO52XGVT;UseServerSidePrepare=1;DATABASE=PortVantage;";
> > int i, rc;
> >
> > colVal[0][0] = colVal[1][0] = colVal[2][0] = 0;
> >
> > rc = SQLSetEnvAttr(NULL, SQL_ATTR_CONNECTION_POOLING, (SQLPOINTER)SQL_CP_ONE_PER_HENV, 0);
> > if (rc) printerr(rc);
> > rc = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
> > if (rc) printerr(rc);
> > rc = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0);
> > if (rc) printerr(rc);
> > rc = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
>
> > rc = SQLSetConnectAttr(hdbc, SQL_ATTR_ODBC_CURSORS, (SQLPOINTER)SQL_CUR_USE_ODBC, 0);
> > if (rc) printerr(rc);
>
> Please try to skip the above SQLSetConnectAttr operation.
>
> > rc = SQLDriverConnect(hdbc, NULL, (SQLCHAR*)cstr, strlen(cstr),
> > (SQLCHAR*)connOut, 2048, NULL, SQL_DRIVER_NOPROMPT);
> > if (rc) printerr(rc);
> > rc = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
> > if (rc) printerr(rc);
> > rc = SQLSetStmtAttr(hstmt, SQL_ATTR_ROW_ARRAY_SIZE, (SQLPOINTER)1, SQL_IS_INTEGER);
> > if (rc) printerr(rc);
> > rc = SQLSetStmtAttr(hstmt, SQL_ATTR_CURSOR_TYPE, (SQLPOINTER)SQL_CURSOR_KEYSET_DRIVEN, 0);
> > // rc=1 State=01S02 Native=0 Message=[unixODBC][Driver Manager]Option value changed
> > if (rc) printerr(rc);
> > rc = SQLSetStmtAttr(hstmt, SQL_ATTR_MAX_ROWS, 0, SQL_IS_INTEGER);
> > if (rc) printerr(rc);
> > rc = SQLSetStmtAttr(hstmt, SQL_ATTR_CONCURRENCY, (SQLPOINTER)SQL_CONCUR_ROWVER, 0);
> > // rc=1 State=01S02 Native=0 Message=[unixODBC][Driver Manager]Option value changed
> > if (rc) printerr(rc);
> > rc = SQLPrepare(hstmt, (UCHAR*)query, strlen(query));
> > if (rc) printerr(rc);
> > rc = SQLExecute(hstmt);
> > if (rc) printerr(rc);
> > for (i = 0; i < 3; ++i) {
> > length_or_ind[i] = SQL_NTS;
> > rc = SQLBindCol(hstmt, (SQLUSMALLINT)i+1, SQL_C_CHAR, colVal[i], 32, &length_or_ind[i]);
> > if (rc) printerr(rc);
> > }
> > rc = SQLFetchScroll(hstmt, SQL_FETCH_NEXT, 0);
> > // rc=100 - Record Not Found
> > if (rc) printerr(rc);
> > strcpy(colVal[0], "foo");
> > length_or_ind[0] = 3;
> > strcpy(colVal[1], "1");
> > length_or_ind[1] = 1;
> > strcpy(colVal[2], "2014-06-06 10:15:00");
> > length_or_ind[2] = 19;
> > rc = SQLBulkOperations(hstmt, SQL_ADD);
> > // rc=-1 State=IM001 Native=0 Message=[unixODBC][Driver Manager]Driver does not support this function
> > if (rc) printerr(rc);
> > rc = 0;
> > }
>

It looks like that's going to work. I'll do some testing and let you
know if I run into any problems.

Thanks, Hiroshi!

In response to

Browse pgsql-odbc by date

  From Date Subject
Next Message Dave Page 2014-06-07 10:21:55 Re: Need new psqlODBC release to update OpenSSL again
Previous Message Hiroshi Inoue 2014-06-07 05:59:52 Re: SQLBulkOperations