代码如下,你可以直接考过去调试
#include <conio.h>//getch()
#include <stdio.h>
#include <afxwin.h>//// MFC core and standard components
#include <sqlext.h> //包含有扩展的ODBC的定义
#include <sql.h> //包含有基本的ODBC API的定义
#pragma comment(lib, "odbc32.lib")int main(int argc, char* argv[])
{
 
SQLRETURN sr;
SQLHENV  hEnv; //分配odbc环境
SQLHDBC  hDbc;//
SQLHSTMT hStmt;//
//
SQLCHAR szName[50];
SQLINTEGER cbName;
//
char szDSN[] = "TestDB";//ODBC数据源 
char szUID[] = "sa"; //SQL用户
char szAuthStr[] = ""; //口令
LPCSTR svSQL="select szName from [ApiOdbc]"; //创建环境句柄
sr = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&hEnv);
if(sr==SQL_SUCCESS)
{
printf("1~~创建环境句柄SQLAllocHandle Success!\n");
}
    sr = SQLSetEnvAttr(hEnv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER) SQL_OV_ODBC3,SQL_IS_INTEGER); 
if(sr==SQL_SUCCESS)
{
printf("2~~SQLSetEnvAttr Success!\n");
}
//创建连接句柄
sr = SQLAllocHandle(SQL_HANDLE_DBC,hEnv,&hDbc); 
    if(sr==SQL_SUCCESS)
{
printf("3~~创建连接句柄SQL_HANDLE_DBC Success!\n");
}
//设置连接属性
    sr = SQLSetConnectAttr(hDbc,SQL_ATTR_LOGIN_TIMEOUT,(void*)5,0); 
if(sr==SQL_SUCCESS)
{
printf("4~~设置连接属性SQLSetConnectAttr Success!\n");
}
//连接
sr = SQLConnect(hDbc,(SQLCHAR *)szDSN, SQL_NTS,(SQLCHAR *)szUID,SQL_NTS,(SQLCHAR *)NULL,SQL_NTS); 
    if(sr == SQL_SUCCESS) -----------------------------------这里不能通过上面返回都是对的
{
printf("5~~连接Connect Success!\n");

//分配语句句柄
sr=SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hStmt);
    if(sr==SQL_SUCCESS)
{
printf("6~~分配语句句柄SQL_HANDLE_STMT Success!\n");
}
//执行SQL查询语句
sr=SQLExecDirect(hStmt,(UCHAR *)svSQL,SQL_NTS);
if (sr == SQL_SUCCESS) 
    {
        printf("7~~执行SQL查询语句SQLExecDirect Success!\n");
while ((sr=SQLFetch(hStmt))!=SQL_NO_DATA)
{
//执行SQL语句后遍历结果集来得到数据
SQLGetData(hStmt, 2, SQL_C_CHAR, szName, 50, &cbName);
printf("%s\n",szName);
}
}    //断开数据库连接
sr = SQLDisconnect(hDbc); 
if(hDbc != SQL_NULL_HANDLE) 
SQLFreeHandle(SQL_HANDLE_DBC,hDbc); 
if(hDbc != SQL_NULL_HANDLE) 
SQLFreeHandle(SQL_HANDLE_ENV,hEnv);
if(hStmt!=NULL)
SQLFreeStmt( hStmt, SQL_DROP );   printf("Hello API ODBC!\n");
getch();
return 0;
}
解决问题再加100分,拼老本啊
Email :[email protected]

解决方案 »

  1.   

    这段程序有三个小问题:
    1.//连接
    sr = SQLConnect(hDbc,(SQLCHAR *)szDSN, SQL_NTS,(SQLCHAR *)szUID,SQL_NTS,(SQLCHAR *)NULL,SQL_NTS); 
    这里如果连接成功可以返回的是SQL_SUCCESS_WITH_INFO(General warning Driver-specific informational message,有 warning)而不并只有SQL_SUCCESS2.执行LPCSTR svSQL="select szName from [ApiOdbc]";后返回一列数据
    而你
    //执行SQL语句后遍历结果集来得到数据
    SQLGetData(hStmt, 2, SQL_C_CHAR, szName, 50, &cbName);取第二列数据,当然取不到,
    sql语句改为select * from [ApiOdbc];3.if(hStmt!=NULL)SQLFreeStmt( hStmt, SQL_DROP ); 
    要在断开数据库sr = SQLDisconnect(hDbc); 连接前释放
      

  2.   

    是有上面的问题,可修改后还是不行啊,还是在 //连接 那里出现问题~~~我整理了一下,帮看看啊,怎么就连接不上呢??????#include <conio.h>//getch()
    #include <stdio.h>
    #include <afxwin.h>//// MFC core and standard components
    #include <sqlext.h> //包含有扩展的ODBC的定义
    #include <sql.h> //包含有基本的ODBC API的定义
    #pragma comment(lib, "odbc32.lib")int main(int argc, char* argv[])
    {
     
    SQLRETURN sr;
    SQLHENV  hEnv; //分配odbc环境
    SQLHDBC  hDbc;//
    SQLHSTMT hStmt;//
    //
    SQLCHAR szName[50];
    SQLINTEGER cbName;
    //
    char szDSN[] = "TestDB";//ODBC数据源 
    char szUID[] = "sa"; //SQL用户
    char szAuthStr[] = ""; //口令
    LPCSTR svSQL="select * from [ApiOdbc]";// //创建环境句柄
    sr = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&hEnv);
    if(sr==SQL_SUCCESS)
    {
    printf("1~~创建环境句柄SQLAllocHandle Success!\n");
    }
             sr = SQLSetEnvAttr(hEnv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER) SQL_OV_ODBC3,SQL_IS_INTEGER); 
    if(sr==SQL_SUCCESS)
    {
    printf("2~~SQLSetEnvAttr Success!\n");
    }
    //创建连接句柄
    sr = SQLAllocHandle(SQL_HANDLE_DBC,hEnv,&hDbc); 
             if(sr==SQL_SUCCESS)
    {
    printf("3~~创建连接句柄SQL_HANDLE_DBC Success!\n");
    }
    //设置连接属性
             sr = SQLSetConnectAttr(hDbc,SQL_ATTR_LOGIN_TIMEOUT,(void*)5,0); 
    if(sr==SQL_SUCCESS)
    {
    printf("4~~设置连接属性SQLSetConnectAttr Success!\n");
    }
    //连接
    sr = SQLConnect(hDbc,(SQLCHAR *)szDSN, SQL_NTS,(SQLCHAR *)szUID,SQL_NTS,(SQLCHAR *)NULL,SQL_NTS); 
             if(sr == SQL_SUCCESS||sr == SQL_SUCCESS_WITH_INFO) 
    {
    printf("5~~连接Connect Success!\n");

    //分配语句句柄
    sr=SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hStmt);
        if(sr==SQL_SUCCESS)
    {
    printf("6~~分配语句句柄SQL_HANDLE_STMT Success!\n");
    }
    //执行SQL查询语句
    sr=SQLExecDirect(hStmt,(UCHAR *)svSQL,SQL_NTS);
    if (sr == SQL_SUCCESS) 
            { 
             printf("7~~执行SQL查询语句SQLExecDirect Success!\n");
    while ((sr=SQLFetch(hStmt))!=SQL_NO_DATA)
    {
    //执行SQL语句后遍历结果集来得到数据
    SQLGetData(hStmt, 3, SQL_C_CHAR, szName, 50, &cbName);
    printf("%s\n",szName);
    }
    } //释放
    if(hStmt!=NULL)
    SQLFreeStmt( hStmt, SQL_DROP );
        //断开数据库连接
    sr = SQLDisconnect(hDbc); 
    if(hDbc != SQL_NULL_HANDLE) 
    SQLFreeHandle(SQL_HANDLE_DBC,hDbc); 
    if(hDbc != SQL_NULL_HANDLE) 
    SQLFreeHandle(SQL_HANDLE_ENV,hEnv);
       printf("Hello API ODBC!\n");
    getch();
    return 0;
    }