|
安装了unixodbc、freetds,在ODBCConfig中配置了system dsn,
用DataManager、isql、tsql 等测试均可连通。
安装了PERL的unixODBC模块。
运行CPAN的EXAMPLE后失败,错误信息如下:
Use of uninitialized value in subroutine entry at unixodbc.pl line 40.
Use of uninitialized value in subroutine entry at unixodbc.pl line 66.
Use of uninitialized value in subroutine entry at unixodbc.pl line 91.
Use of uninitialized value in subroutine entry at unixodbc.pl line 105.
Use of uninitialized value in subroutine entry at unixodbc.pl line 105.
Use of uninitialized value in subroutine entry at unixodbc.pl line 105.
Use of uninitialized value in subroutine entry at unixodbc.pl line 105.
Segmentation fault
源文件如下:
[PHP]use UnixODBC ':all';
# ODBC Handles
my $evh; # Environment handle
my $cnh; # Connection handle
my $sth; # Statement handle
# Return Value of Function Calls
my $r; # result
# Common Data Buffers and Data Lengths
my $buf; # Buffer for results
my $rlen; # Length of Returned Value.
# Variables for Diagnostic Messages
my $diagrecno = 1;
my $sqlstate;
# DSN Name and Login Information. Edit the DSN, login,
# and password when using this script on another system.
my $DSN = 'Catalog';
my $UserName = 'user';
my $PassWord = 'password';
# SQL Query. In this example, the table is named "titles"
# and contains 5 data columns.
my $query = 'select * from titles;';
# Allocate the environment handle. If the function resulted in
# an error, print the Diagnostic information and exit the
# program.
$r = SQLAllocHandle ($SQL_HANDLE_ENV, $SQL_NULL_HANDLE, $evh);
# After function calls, retrieve the diagnostic record, print
# the diagnostic message, and exit if the function was
# unsuccessful.
if (($r!=$SQL_SUCCESS)&&($r!=$SQL_NO_DATA)) {
SQLGetDiagRec ($SQL_HANDLE_ENV, $evh, $diagrecno, $sqlstate,
$native, $buf, $SQL_MAX_MESSAGE_LENGTH, $rlen);
print "$buf\n";
exit 1
}
# Specify ODBC Version 2
$r = SQLSetEnvAttr($evh, $SQL_ATTR_ODBC_VERSION, $SQL_OV_ODBC2, 0);
if (($r!=$SQL_SUCCESS)&&($r!=$SQL_NO_DATA)) {
SQLGetDiagRec ($SQL_HANDLE_ENV, $evh, $diagrecno, $sqlstate,
$native, $buf, $SQL_MAX_MESSAGE_LENGTH, $rlen);
print "$buf\n";
exit 1;
}
# Allocate the connection handle.
$r = SQLAllocHandle ($SQL_HANDLE_DBC, $evh, $cnh);
if (($r!=$SQL_SUCCESS)&&($r!=$SQL_NO_DATA)) {
SQLGetDiagRec ($SQL_HANDLE_ENV, $evh, $diagrecno, $sqlstate,
$native, $buf, $SQL_MAX_MESSAGE_LENGTH, $rlen);
print "$buf\n";
exit 1;
}
# Connect to the data source. $SQL_NTS in place of the length of the
# preceding parameter indicates a null-terminated string.
$r = SQLConnect ($cnh, $DSN, $SQL_NTS,
$UserName, $SQL_NTS,
$PassWord, $SQL_NTS);
if (($r!=$SQL_SUCCESS)&&($r!=$SQL_NO_DATA)) {
SQLGetDiagRec ($SQL_HANDLE_DBC, $cnh, $diagrecno, $sqlstate,
$native, $buf, $SQL_MAX_MESSAGE_LENGTH, $rlen);
print "$buf\n";
exit 1;
}
# Allocate a statement handle.
$r = SQLAllocHandle ($SQL_HANDLE_STMT, $cnh, $sth);
if (($r!=$SQL_SUCCESS)&&($r!=$SQL_NO_DATA)) {
SQLGetDiagRec ($SQL_HANDLE_STMT, $sth, $diagrecno, $sqlstate,
$native, $buf, $SQL_MAX_MESSAGE_LENGTH, $rlen);
print "$buf\n";
exit 1;
}
# Prepare the SQL query.
$r = SQLPrepare ($sth, $query, length ($query));
if (($r!=$SQL_SUCCESS)&&($r!=$SQL_NO_DATA)) {
SQLGetDiagRec ($SQL_HANDLE_STMT, $sth, $diagrecno, $sqlstate,
$native, $buf, $SQL_MAX_MESSAGE_LENGTH, $rlen);
print "$buf\n";
exit 1;
}
# Execute the SQL query.
$r = SQLExecute ($sth);
if (($r!=$SQL_SUCCESS)&&($r!=$SQL_NO_DATA)) {
SQLGetDiagRec ($SQL_HANDLE_STMT, $sth, $diagrecno, $sqlstate,
$native, $buf, $SQL_MAX_MESSAGE_LENGTH, $rlen);
print "$buf\n";
exit 1;
}
# Loop to retrieve data rows.
# Keep looping and then exit when there is no more data. More
# complex programs may need to check for the number of rows and
# columns in the result set before retrieving the data.
while (1) {
# Fetch the next row of data in the result set.
$r = SQLFetch ($sth);
# Exit the loop if there is no more data.
last if $r == $SQL_NO_DATA;
# Loop to retrieve the data for columns 1..5.
foreach my $column (1..5) {
$r = SQLGetData ($sth, $column, $SQL_C_CHAR, $buf,
$SQL_MAX_MESSAGE_LENGTH, $rlen);
# Print results with fields delimited by tabs.
print "$buf\t";
}
# Delimit rows in the output with newlines.
print "\n";
}
# Clean up. De-allocate the statement handle
$r = SQLFreeHandle ($SQL_HANDLE_STMT, $sth);
if (($r!=$SQL_SUCCESS)&&($r!=$SQL_NO_DATA)) {
SQLGetDiagRec ($SQL_HANDLE_STMT, $sth, $diagrecno, $sqlstate,
$native, $buf, $SQL_MAX_MESSAGE_LENGTH, $rlen);
print "$buf\n";
exit 1;
}
# Disconnect from the DSN.
$r = SQLDisconnect ($cnh);
if (($r!=$SQL_SUCCESS)&&($r!=$SQL_NO_DATA)) {
SQLGetDiagRec ($SQL_HANDLE_DBC, $cnh, $diagrecno, $sqlstate,
$native, $buf, $SQL_MAX_MESSAGE_LENGTH, $rlen);
print "$buf\n";
exit 1;
}
# De-allocate the connection handle.
$r = SQLFreeConnect ($cnh);
if (($r!=$SQL_SUCCESS)&&($r!=$SQL_NO_DATA)) {
SQLGetDiagRec ($SQL_HANDLE_DBC, $cnh, $diagrecno, $sqlstate,
$native, $buf, $SQL_MAX_MESSAGE_LENGTH, $rlen);
print "$buf\n";
exit 1;
}
# De-allocate the environment handle.
$r = SQLFreeHandle ($SQL_HANDLE_ENV, $evh);
if (($r!=$SQL_SUCCESS)&&($r!=$SQL_NO_DATA)) {
SQLGetDiagRec ($SQL_HANDLE_ENV, $evh, $diagrecno, $sqlstate,
$native, $buf, $SQL_MAX_MESSAGE_LENGTH, $rlen);
print "$buf\n";
exit 1;
}
exit 0;[/PHP] |
|