运行结果如下:Error -1 performing SQLExecute
SQLState = 37000
SQL message = [Microsoft][ODBC Excel Driver] 'Sheet1 $'不是一个有效名称。请确认它不包含无效的字符或标点,且名称不太长。源代码如下(该代码出自“Windows 98/NT 编程大全”的第32章 采用ODBC规范进行数据库编程):#include "stdafx.h"
#include <WINDOWS.H>
#include <SQL.H>
#include <SQLEXT.H>
#include <STRING.H>
#include <STDIO.H>#define CONNSTR "DBQ=AGES.XLS;DRIVER={Microsoft Excel Driver (*.xls)}"
#define CONNLEN (sizeof(CONNSTR) - 1)#define SQLTRY(x, y)\
{\
rc = y;\
if (rc != SQL_SUCCESS)\
{\
UCHAR szState[6];\
UCHAR szMsg[255];\
SDWORD sdwNative;\
SWORD swMsgLen;\
SQLError(hEnv, hDBC, hStmt, szState, &sdwNative, szMsg, sizeof(szMsg), &swMsgLen);\
printf("Error %d performing %s \n SQLState = %s \n SQL message = %s \n", rc, x, szState, szMsg);\
goto Terminate;\
}\
}
int main(int argc, char* argv[])
{
SQLHENV hEnv = 0;
SQLHDBC hDBC = 0;
SQLHSTMT hStmt = 0;
SQLCHAR szConnStr[255];
SQLCHAR szStmt[255];
SQLCHAR szFirstName[255];
SQLCHAR szLastName[255];
long nAge;
SWORD cbConnStr;
RETCODE rc;
SDWORD sdwLNLen;
SDWORD sdwFNLen;
SDWORD sdwALen; int i; SQLTRY("SQLAllocEnv", SQLAllocEnv(&hEnv));
SQLTRY("SQLAllocConnect", SQLAllocConnect(hEnv, &hDBC));
SQLTRY("SQLDriverConnect", SQLDriverConnect(hDBC, NULL, (UCHAR*)CONNSTR, CONNLEN, szConnStr, sizeof(szConnStr), &cbConnStr, SQL_DRIVER_NOPROMPT));
SQLTRY("SQLAllocStmt", SQLAllocStmt(hDBC, &hStmt));
sprintf((char*)szStmt, "SELECT * FROM [Sheet1 $]");
SQLTRY("SQLPrepare", SQLPrepare(hStmt, szStmt, strlen((char*)szStmt))); SQLTRY("SQLBindCol", SQLBindCol(hStmt, 1, SQL_C_CHAR, (PTR)szLastName, sizeof(szLastName), &sdwLNLen));
SQLTRY("SQLBindCol", SQLBindCol(hStmt, 2, SQL_C_CHAR, (PTR)szFirstName, sizeof(szFirstName), &sdwFNLen));
SQLTRY("SQLBindCol", SQLBindCol(hStmt, 3, SQL_C_SLONG, (PTR)&nAge, sizeof(nAge), &sdwALen)); SQLTRY("SQLExecute", SQLExecute(hStmt)); for (i = 1; (rc = SQLFetch(hStmt)) == SQL_SUCCESS; i++)
{
printf("Record # %d\tLast Name: %s\tFirst Name: %s\tAge: %d\n", i, szLastName, szFirstName, nAge);
} if (rc != SQL_NO_DATA_FOUND)
{
SQLTRY("SQLFetch", rc);
} printf("Successfully completed.\n");
SQLCloseCursor(hStmt);Terminate:
if (hStmt)
SQLFreeStmt(hStmt, SQL_CLOSE);
if (hDBC)
SQLDisconnect(hDBC);
if (hDBC)
SQLFreeConnect(hDBC);
if (hEnv)
SQLFreeEnv(hEnv); system("PAUSE"); return 0;
}我使用Microsoft Office Excel 2003建立了ages.xls。“Sheet1 $”会不会有错?书上说“名字Sheet1 $是驱动程序为Excel工作簿中第一个电子数据表格提供的名字”。这是我的第一个ODBC程序,大家帮帮我。

解决方案 »

  1.   

    不要空格
    "SELECT * FROM [sheet1$]";
      

  2.   

    呵呵,搞定。请问sheet1$名字是在哪里查到的?
      

  3.   

    系统默认啊。
    ————————————————————————————————————————
    书上说“名字Sheet1 $是驱动程序为Excel工作簿中第一个电子数据表格提供的名字”。
    ————————————————————————————————————————