From: Jim B. <Jim...@sa...> - 2003-12-23 19:38:22
|
I just noticed this post and checked into it ... it appears that the = problem is actually SAS v9 making a call to = SQLColAttribute(SQL_COLUMN_LENGTH) - the ODBC trace looks like: ...snip... sashost 4b0-ef4 EXIT SQLTablesW with return code 0 = (SQL_SUCCESS) HSTMT 04302E60 WCHAR * 0x00000000 SWORD 0 WCHAR * 0x00000000 SWORD 0 WCHAR * 0x00000000 SWORD 0 WCHAR * 0x00000000 SWORD 0 sashost 4b0-ef4 ENTER SQLNumResultCols HSTMT 04302E60 SWORD * 0x062AECAA sashost 4b0-ef4 EXIT SQLNumResultCols with return code 0 = (SQL_SUCCESS) HSTMT 04302E60 SWORD * 0x062AECAA (5) sashost 4b0-ef4 ENTER SQLDescribeCol HSTMT 04302E60 UWORD 1 UCHAR * 0x02844A0C SWORD 129 SWORD * 0x02844A8E SWORD * 0x02844A90 SQLULEN * 0x02844A94 SWORD * 0x02844A98 SWORD * 0x02844A9A sashost 4b0-ef4 EXIT SQLDescribeCol with return code 0 = (SQL_SUCCESS) HSTMT 04302E60 UWORD 1 UCHAR * 0x02844A0C [ 9] "TABLE_CAT" SWORD 129 SWORD * 0x02844A8E (9) SWORD * 0x02844A90 (1) SQLULEN * 0x02844A94 (31) SWORD * 0x02844A98 (0) SWORD * 0x02844A9A (1) sashost 4b0-ef4 ENTER SQLColAttribute SQLHSTMT 04302E60 SQLSMALLINT 1 SQLSMALLINT 3 <unknown> SQLPOINTER 0x00000000 SQLSMALLINT 0 SQLSMALLINT * 0x00000000 SQLPOINTER 0x02844AA0 sashost 4b0-ef4 EXIT SQLColAttribute with return code -1 = (SQL_ERROR) SQLHSTMT 04302E60 SQLSMALLINT 1 SQLSMALLINT 3 <unknown> SQLPOINTER 0x00000000 SQLSMALLINT 0 SQLSMALLINT * 0x00000000 SQLPOINTER 0x02844AA0 DIAG [HY091] field id (3) out of range (0) ...snip... The ODBC Spec says that ODBC 3.x drivers must still support the older = SQL_COLUMN_* attributes as well as the newer SQL_DESC_* attributes: ---------- The #define values of the ODBC 2.x FieldIdentifiers SQL_COLUMN_LENGTH, = SQL_COLUMN_PRECISION, and SQL_COLUMN_SCALE are different from the = #define values of the ODBC 3.x FieldIdentifiers SQL_DESC_PRECISION, = SQL_DESC_SCALE, and SQL_DESC_LENGTH. An ODBC 2.x driver need only = support the ODBC 2.x values. An ODBC 3.x driver must support both = "SQL_COLUMN" and "SQL_DESC" values for these three FieldIdentifiers. = These values are different because precision, scale, and length are = defined differently in ODBC 3.x than they were in ODBC 2.x.=20 ---------- The SAS driver makes 2.x calls in this case to try to remain compatible = with older drivers. Interestingly, I seem to be getting strange behavior if I instead try to = request SQLColAttribute(SQL_DESC_LENGTH) as well ... it returns 1 which = seems a bit small ;-) ... The ODBC Test (odbcte32.exe) log looks like: SQLTables: In: StatementHandle =3D 0x003A2880, CatalogName =3D SQL_NULL_HANDLE, = NameLength1 =3D 0,=20 SchemaName =3D SQL_NULL_HANDLE, NameLength2 =3D 0, TableName =3D = SQL_NULL_HANDLE, NameLength3 =3D 0, TableType =3D SQL_NULL_HANDLE, = NameLength4 =3D 0 Return: SQL_SUCCESS=3D0 SQLColAttribute: In: StatementHandle =3D 0x003A2880, ColumnNumber =3D 1, FieldIdentifier = =3D SQL_DESC_LENGTH=3D1003,=20 CharacterAttributePtr =3D 0x011D0020, BufferLength =3D 300, = StringLengthPtr =3D 0x00094320, NumericAttributePtr =3D 0x00095120,=20 fFieldIndentifier Type =3D SQL_C_SLONG=3D-16 Return: SQL_SUCCESS=3D0 Out: *CharacterAttributePtr =3D <unmodified>, *StringLengthPtr =3D = <unmodified>, *NumericAttributePtr =3D 1 TST1001: Buffer CharacterAttributePtr was not updated. TST1001: Buffer StringLengthPtr was not updated. I'm using the 12/13 drivers with SAS v9.1 on Windows XP professional, if = that helps. 12/13/2003 10:12 PM 159,744 OdbcJdbc.dll 12/13/2003 10:12 PM 69,632 OdbcJdbcSetup.dll 12/13/2003 10:12 PM 172,032 IscDbc.dll Anyway, keep up the great work Vladimir - it is appreciated!! Thanks, -Jim Beesley "Brian McGee" <bm4...@ya...> wrote in message = news:br0b92$scg$1...@ne......> I am testing the latest CVS tree = version of the driver with the SAS Data=20 > Analysis Suite V9. During an attempt to have SAS list all the tables=20 > available in the database I receive the error: > "ERROR: CLI describe error: field id(3) out of range" ...snip... |