Re: Connecting to Sybase with perl+DBI::ODBC results in an error?
Frediano Ziglio <[email protected]>
| Newsgroups | gmane.comp.db.tds.freetds |
|---|---|
| Message-ID | <[email protected]> |
2010/12/1 Peter C. Norton <[email protected]>: > I've been trying to connect to a Sybase server via perl's DBI::ODBC > module, which calls down through unixODBC (in our case) and then into > freetds. My test code looks like this: > > #!/usr/local/bin/perl > > use DBI; > # use DBI::ODBC; > > my $dbh = DBI->connect('dbi:ODBC:SYBDEV', 'USER', 'PASSWORD', {AutoCommit=>1}); > > # my $sth = $dbh->prepare("audit_archive..sp__ls"); > # print $sth->execute(); > my $sth = $dbh->prepare("select * from audit_archive..sysobjects"); > $sth->execute(); > my @row; > while(@row = $sth->fetchrow_array) { > print( join(", ", @row), "\n"); > } > > > whatever the AutoCommit attribute is set to, I get this message: > > DBI connect('SYBDEV','USER',...) failed: [FreeTDS][SQL Server]Could not change transaction status (SQL-HY000) [state was HY000 now 01000] > > The trace looks like this: > > log.c:196:Starting log file for FreeTDS 0.83.dev.hg2git_nortonp.4199 > on 2010-11-30 18:46:58 with debug flags 0x4fff. > iconv.c:337:tds_iconv_open(0xb9b1e40, ISO-8859-1) > iconv.c:197:local name for ISO-8859-1 is ISO-8859-1 > iconv.c:197:local name for UTF-8 is UTF-8 > iconv.c:197:local name for UCS-2LE is UCS-2LE > iconv.c:197:local name for UCS-2BE is UCS-2BE > (etc.) > > token.c:2796:tds_process_msg() returning TDS_SUCCEED > token.c:337:looking for login token, got e3(ENVCHANGE) > token.c:122:tds_process_default_tokens() marker is e3(ENVCHANGE) > token.c:2599:changing block size from to 512 > token.c:337:looking for login token, got ad(LOGINACK) > token.c:372:server reports TDS version 5.0.0.0 > token.c:374:Product name for 0x5000000 is unknown > token.c:337:looking for login token, got e2(CAPABILITY) > token.c:122:tds_process_default_tokens() marker is e2(CAPABILITY) > token.c:337:looking for login token, got fd(DONE) > token.c:122:tds_process_default_tokens() marker is fd(DONE) > token.c:2461:tds_process_end: more_results = 0 > was_cancelled = 0 > error = 0 > done_count_valid = 0 > token.c:2477:tds_process_end() state set to TDS_IDLE > token.c:2492: rows_affected = 527 > token.c:437:tds_process_login_tokens() returning TDS_SUCCEED > odbc.c:4919:SQLGetFunctions: fFunction is 999 > odbc.c:6116:_SQLSetConnectAttr(0xb9b0400, 102, 0x1, 0) > odbc.c:235:change_autocommit: executing WHILE @@TRANCOUNT > 0 COMMIT > mem.c:615:tds_free_all_results() > util.c:156:Changed query state from IDLE to QUERYING > util.c:156:Changed query state from QUERYING to PENDING > net.c:730:Sending packet > 0000 0f 01 00 2a 00 00 00 00-21 1d 00 00 00 00 57 48 |...*.... !.....WH| > 0010 49 4c 45 20 40 40 54 52-41 4e 43 4f 55 4e 54 20 |ILE @@TR ANCOUNT | > 0020 3e 20 30 20 43 4f 4d 4d-49 54 |> 0 COMM IT| > > token.c:539:tds_process_tokens(0xb9b1e40, 0x7fffdfcd8f5c, 0x7fffdfcd8f58, 0x100) > util.c:156:Changed query state from PENDING to READING > net.c:546:Received header > 0000 04 01 00 08 00 00 00 00- |........| > > net.c:600:Received packet > 0000 04 01 00 08 00 00 00 00- |........| > empty reply packet ?? > util.c:331:tdserror(0xb9ae0a0, 0xb9b1e40, 20017, 115) 20017 == EOF however 115 == EINPROGRESS (at least on my system). Perhaps read/recv on Solaris returns EINPROGRESS which is misdetected as an error... quite strange... or 115 is another error on Solaris... > odbc.c:2273:msgno 20017 20003 > util.c:361:tdserror: client library returned TDS_INT_CANCEL(2) > util.c:384:tdserror: returning TDS_INT_CANCEL(2) > util.c:156:Changed query state from READING to DEAD > token.c:554:processing result tokens. marker is 0() > token.c:122:tds_process_default_tokens() marker is 0() > token.c:125:leaving tds_process_default_tokens() connection dead > util.c:104:logic error: cannot change query state from DEAD to PENDING > error.c:412:odbc_errs_add: "Could not change transaction status" > error.c:517:SQLGetDiagRec(2, 0xb9b0400, 1, 0x7fffdfcd9040, 0x7fffdfcd905c, 0x7fffdfcd8e40, 512, 0x7fffdfcd9058) > error.c:566:SQLGetDiagRec: "[FreeTDS][SQL Server]Unexpected EOF from the server" > error.c:517:SQLGetDiagRec(2, 0xb9b0400, 2, 0x7fffdfcd9040, 0x7fffdfcd905c, 0x7fffdfcd8e40, 512, 0x7fffdfcd9058) > error.c:566:SQLGetDiagRec: "[FreeTDS][SQL Server]Could not change transaction status" > error.c:517:SQLGetDiagRec(2, 0xb9b0400, 3, 0x7fffdfcd9040, 0x7fffdfcd905c, 0x7fffdfcd8e40, 512, 0x7fffdfcd9058) > > > Changing the initial "AutoCommit" attribute's value doesn't seem to > win anything, as it appears to set the autocommit before anything else. > > Any ideas, anyone? > > -Peter > freddy77 _______________________________________________ FreeTDS mailing list [email protected] http://lists.ibiblio.org/mailman/listinfo/freetds